Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1811

 
MakarFX #:

Le biblioteche funzionano?

Ho visto un video da qualche parte in rete su come smontare questa cosa, ma ha bisogno di aprire qualcosa durante la creazione, che siano le testate o qualcos'altro. Ho ricompilato il codice su 64KA e ha funzionato. Bene, si scopre che su 64ka il puntatore a 8 byte è già visto non troppo male e ci possono essere altre differenze critiche che si dovrebbe fortemente giocare con questa domanda. Vorrei semplicemente lavorare con il compilatore a 32 bit per il debug e ho alcune idee specializzate per loro.

 
Potete dirmi perché il doppio 0,00134 non è divisibile per 30?
dà un numero intero e un numero infinito dopo il punto decimale
Dovrebbe essere circa 0,00004
 
Ivan Butko #:
Potete dirmi perché il doppio 0,00134 non è divisibile per 30?
dà un numero intero e un numero infinito dopo il punto decimale
Dovrebbe essere circa 0,00004
Print( DoubleToString(0.00134/30) ); 0.00004467

 
Vitaly Muzichenko #:

Vitaly, se non lo stampi, i calcoli interni mostreranno 0,00004.... o 5.666666.....e ?
O è la stessa cosa?
 
Ivan Butko #:
Vitaly, se non lo stampi, sarà 0,00004.... nei calcoli interni o 5.666666.....e ?
O è la stessa cosa?

i calcoli interni includono solo questo (un intero esadecimale di otto byte)

https://ru.wikipedia.org/wiki/Число_двойной_точности

0.00004467 = 0x3f076b81834d51ed
 
ciao! qualcuno conosce un duplicatore sensato di trade da MT4 al Quick exchange?
 

Buon pomeriggio. Aiuto


Ho un codice senza controllare la presenza di ordini aperti.

Apre gli ordini secondo la logica stabilita, ma apre sia ordini di acquisto che di vendita

void OnTick()
{
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   Comment( 
  "\n",                      name,
  "\n", 
  "Символ ",                 Symbol(),  
  "\n",
  "Тайм Фрейм ",             Period(),
  "\n",                      AccountCompany(),
  "\n",
  " ",                       AccountServer(),
  "\n", 
  "Lots",                    Lot,
  "\n",
  "Объем в бай ",            "BuyLots()",
  "\n", 
  "Объем в сел ",            "SellLots()",
  "\n",
  "Price ",                  Bid,
  "\n", 
  "Дата ",                   TimeToString( TimeCurrent(), TIME_DATE ),
  "\n",
  "Server Time ",            TimeToString( TimeCurrent(), TIME_SECONDS ),
  "\n", 
  "\n", "Процент просадки ", NormalizeDouble(  (AccountInfoDouble(ACCOUNT_BALANCE)-AccountInfoDouble(ACCOUNT_MARGIN_FREE))/AccountInfoDouble(ACCOUNT_BALANCE)*100, 
  2)/*, "\n" //"  CalcTP() ", CalcTP(),
,  "  t_p $ ", t_p, "  Profit() $ ", Profit(), "\n",  */); 
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   /*if (CountTrades() == 0 && TypeOrder(OP_BUY) && TypeOrder(OP_SELL))
      {*/
       double body = Close[1] - Open[1];
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
//Открытие позиции Buy
    if (body > 0)
       {
        Forder = (OrderSend(_Symbol,OP_BUY,Lot,Ask,iSlippage,0,0,"Коммент",Magic,0,Blue));
        if(Forder > 0)
          {
           Print("Открыта Позиция BUY");
           if(OrderSelect(Forder, SELECT_BY_TICKET))
             {
              TP = NormalizeDouble((Ask+iTakeProfit*_Point),_Digits);
              if (OrderModify(OrderTicket(),OrderOpenPrice(),0,TP,0))
                 Print("Ордер Модифицирован BUY "); 
              else 
                 Print("Ошибка Модификации Ордера BUY = ",GetLastError());
             }
          }Print("Ошибка Открытия Позиции BUY");
       }
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
//Открытие позиции Sell      
    if (body < 0)
       {
        Forder = (OrderSend(_Symbol,OP_SELL,Lot,Bid,iSlippage,0,0,"Коммент Sell",Magic,0,Red));
        if (Forder > 0)
           {
            Print("Открыта Позиция SELL");
            if(OrderSelect(Forder, SELECT_BY_TICKET))
              {
               TP = NormalizeDouble((Bid-iTakeProfit*_Point),_Digits);
               if (OrderModify(OrderTicket(),OrderOpenPrice(),0,TP,0))
                   Print("Ордер Модифицирован SELL "); 
               else 
                   Print("Ошибка Модификации Ордера SELL = ",GetLastError());
              }
           }Print("Ошибка Открытия Позиции SELL");
       }
     }  
 //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//      
  /* else 
   {
   
   }*/
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
/*}*/

Lavoreremo con questi ordini.

//non deve controllare l'ordine se è aperto.


Se si abilita il controllo, allora gli ordini non vengono aperti come vorremmo.
Se vogliamo evitare i contrordini, dovremmo controllare il primo ordine da aprire e poi aprire lo stesso tipo fino a quando l'ultimo tipo di ordine viene chiuso e poi tornare alla logica del controllo delle condizioni di apertura.

int TypeOrder(int OrType)
{
 int count = 0;
  for(int i = OrdersTotal(); i>=0; i++ )
     {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
          if (OrderSymbol() == _Symbol && OrderType() == OrType && OrderMagicNumber() == Magic)
             {
              count++;
             }
         }
     }return (count);
}

E come indicare questo non si capisce.
C'è qualcuno là fuori che può dare una spinta a capire?

Grazie per qualsiasi suggerimento.

 
Alexander Avksentyev #:

Buon pomeriggio.

void OnTick()
  {
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   Comment( 
  "\n",                      name,
  "\n", 
  "Символ ",                 Symbol(),  
  "\n",
  "Тайм Фрейм ",             Period(),
  "\n",                      AccountCompany(),
  "\n",
  " ",                       AccountServer(),
  "\n", 
  "Lots",                    Lot,
  "\n",
  "Объем в бай ",            "BuyLots()",
  "\n", 
  "Объем в сел ",            "SellLots()",
  "\n",
  "Price ",                  Bid,
  "\n", 
  "Дата ",                   TimeToString( TimeCurrent(), TIME_DATE ),
  "\n",
  "Server Time ",            TimeToString( TimeCurrent(), TIME_SECONDS ),
  "\n", 
  "\n", "Процент просадки ", NormalizeDouble(  (AccountInfoDouble(ACCOUNT_BALANCE)-AccountInfoDouble(ACCOUNT_MARGIN_FREE))/AccountInfoDouble(ACCOUNT_BALANCE)*100, 
  2)/*, "\n" //"  CalcTP() ", CalcTP(), "  t_p $ ", t_p, "  Profit() $ ", Profit(), "\n",  */); 
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   double body = Close[1] - Open[1];
   if (CountTrades() == 0 && body > 0) BuyOpen();     // Если нет открытых и сигнал бай
   if (CountTrades() == 0 && body < 0) SellOpen();    // Если нет открытых и сигнал селл
   if (CountTrades(0) > 0 && body > 0) BuyOpen();     // Если есть открытые бай и сигнал бай
   if (CountTrades(1) > 0 && body < 0) SellOpen();    // Если есть открытые селл и сигнал селл
  }  
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров по типу                                 |
//+------------------------------------------------------------------+
int CountTrades(int ot=-1) 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==MagicNum)
              {
               if(OrderType()==ot||ot==-1) cnt++;
              }
           }
        }
     }
   return(cnt);
  }
//+------------------------------------------------------------------+
void BuyOpen() //Открытие позиции Buy
  {
   Forder = (OrderSend(_Symbol,OP_BUY,Lot,Ask,iSlippage,0,0,"Коммент",Magic,0,Blue));
   if(Forder > 0)
     {
      Print("Открыта Позиция BUY");
      if(OrderSelect(Forder, SELECT_BY_TICKET))
        {
         TP = NormalizeDouble((Ask+iTakeProfit*_Point),_Digits);
         if (OrderModify(OrderTicket(),OrderOpenPrice(),0,TP,0))
            Print("Ордер Модифицирован BUY "); 
         else 
            Print("Ошибка Модификации Ордера BUY = ",GetLastError());
        }
     }
   else Print("Ошибка Открытия Позиции BUY");
  }
//+------------------------------------------------------------------+
void SellOpen() //Открытие позиции Sell  
  {
   Forder = (OrderSend(_Symbol,OP_SELL,Lot,Bid,iSlippage,0,0,"Коммент Sell",Magic,0,Red));
   if (Forder > 0)
     {
      Print("Открыта Позиция SELL");
      if(OrderSelect(Forder, SELECT_BY_TICKET))
        {
         TP = NormalizeDouble((Bid-iTakeProfit*_Point),_Digits);
         if (OrderModify(OrderTicket(),OrderOpenPrice(),0,TP,0))
            Print("Ордер Модифицирован SELL "); 
         else 
            Print("Ошибка Модификации Ордера SELL = ",GetLastError());
        }
     }
   else Print("Ошибка Открытия Позиции SELL");
  }
//+------------------------------------------------------------------+
 
MakarFX #:

Grazie. La logica era corretta, rendere il contatore solo corretto e specificare la condizione correttamente

if (CountTrades() == 0 && body > 0) BuyOpen();     // Если нет открытых и сигнал бай
   if (CountTrades() == 0 && body < 0) SellOpen();    // Если нет открытых и сигнал селл
   if (CountTrades(0) > 0 && body > 0) BuyOpen();     // Если есть открытые бай и сигнал бай
   if (CountTrades(1) > 0 && body < 0) SellOpen();    // Если есть открытые селл и сигнал селл

Grazie. Ci darò un'occhiata.

 
Tretyakov Rostyslav #:

Buon pomeriggio. Ecco una domanda. Ho una rete a strascico.

void Trail()
{
 if(iTrailStart <= 0.0)return; 
 double tp,sl_lev;
 for(int i=OrdersTotal()-1; i>=0; i--)
    {
     if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
       {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
          {
           if(OrderType() == OP_BUY) 
             {
              if(iTrailTakeProfit > 0.0)
                {
                tp=OrderTakeProfit() + NormalizeDouble(iTrailTakeProfit * Point(),_Digits);
                if(NormalizeDouble(((tp - OrderTakeProfit())) < 0.0,Digits))return;
                tp = OrderTakeProfit();
                }else tp = 0.0;
              if(OrderProfit() + OrderSwap() + OrderCommission() > MarketInfo(Symbol(), MODE_TICKVALUE) * iTrailStart * OrderLots())return;
                {
                 if(NormalizeDouble(Bid - OrderOpenPrice() <= iTrailStart * Point(),Digits))return;
                   {
                    if(OrderStopLoss()== 0.0 && NormalizeDouble((Bid-OrderStopLoss()) <= iTrailDist * Point(),_Digits))return;
                      {
                      if(iTrailStep > 0.0 && OrderStopLoss()==0.0 && NormalizeDouble((Bid - OrderStopLoss() - iTrailDist * Point() < iTrailStep * Point()),_Digits))return;
                        {
                         sl_lev = NormalizeDouble(Bid - iTrailDist * Point(),_Digits);
                         if(NormalizeDouble((Bid - sl_lev) < MarketInfo(Symbol(),MODE_STOPLEVEL) * Point,Digits))return;
                           {
                            if (!OrderModify(Forder,OrderOpenPrice(),OrderStopLoss() + iTrailStart * Point,OrderTakeProfit(),OrderExpiration()))
                            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
                           }
                        }
                      }
                   }
                }
             }
           if(OrderType() == OP_SELL)
             {
              if(iTrailTakeProfit > 0.0)
                {
                 tp=OrderProfit() - NormalizeDouble(iTrailTakeProfit * Point(),_Digits);
                 if(NormalizeDouble((OrderTakeProfit() - tp) < 0.0,_Digits))return;
                 tp = OrderTakeProfit();
                }else tp = 0.0;
              if(OrderProfit() + OrderSwap() + OrderCommission() > MarketInfo(Symbol(), MODE_TICKVALUE) * iTrailStart * OrderLots())return;
                {
                 if(NormalizeDouble((OrderProfit() - Ask) <= iTrailStart * Point(),_Digits))return;
                   {
                    if(OrderStopLoss() == 0.0 && NormalizeDouble((OrderStopLoss() - Ask) <= iTrailDist * Point(),_Digits))return;
                      {
                       if(iTrailStep > 0.0 && OrderStopLoss() == 0.0 && NormalizeDouble((OrderStopLoss() - Ask) - iTrailDist * Point(),_Digits) < iTrailStep * Point())return;
                         {
                          sl_lev = NormalizeDouble(Ask + iTrailDist * Point(),_Digits);
                          if(NormalizeDouble((sl_lev - Ask) > MarketInfo(Symbol(),MODE_STOPLEVEL) * Point,_Digits)) return;
                            {
                            if (!OrderModify(Forder,OrderOpenPrice(),OrderStopLoss() + iTrailStart * Point,OrderTakeProfit(),OrderExpiration()))
                            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}}}}}}}}}}

Come posso specificare al mio Expert Advisor per farlo funzionare?

void OnTick()
  {
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   Comment( 
  "\n",                      name,
  "\n", 
  " ",                       Symbol(),  
  "\n",
  "Тайм Фрейм ",             Period(),
  "\n",                      AccountCompany(),
  "\n",
  "\n ",                     AccountServer(),
  "\n", 
  "Lots\n",                  B_S_Lot(),
  "\n",
  "Price ",                  Bid,
  "\n", 
  "Дата ",                   TimeToString( TimeCurrent(), TIME_DATE ),
  "\n",
  "Server Time ",            TimeToString( TimeCurrent(), TIME_SECONDS ),
  "\n", 
  "Profit ",                 Profit(),
  "\n",
  "AvTP ",                   CalcTP (),
  "\n", 
  "Количество ордеров ",     CountTrades(),
  "\n",
  "\n ",                     GetVolumeLotLastOrder(),
  "\n",
  "\n", "Процент просадки ", NormalizeDouble(  (AccountInfoDouble(ACCOUNT_BALANCE)-AccountInfoDouble(ACCOUNT_MARGIN_FREE))/AccountInfoDouble(ACCOUNT_BALANCE)*100,2)
  ); 
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   double body = Close[1] - Open[1];
   if (CountTrades() == 0 && body > 0) BuyOpen();     // Если нет открытых и сигнал бай
   if (CountTrades() == 0 && body < 0) SellOpen();    // Если нет открытых и сигнал селл
   if (CountTrades(0) > 0 && body > 0) BuyOpen();     // Если есть открытые бай и сигнал бай
   if (CountTrades(1) > 0 && body < 0) SellOpen();    // Если есть открытые селл и сигнал селл
   Trail();
  }

Ho visto che lo specificano in questo modo, ma in qualche modo non funziona per me.

È un problema generale specificare l'ex perché la funzione funzioni, come devo fare?