Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 404

 

Начал писать обертку для функций открытия и модиффикафий ордеров (думал исправит мой проблемы с возвратом значения от этих операторов)а там такая же проблема. 

Объясните уже в чем  дело та? ( что бы не написал всегда проблема с возратом значений от ОрдерСенд,ОрдерСелекс и МодифиОрдер)

 

Код обертки .

 int start()

{

    if (signal == 1)

    {

      OrderSendX(Symbol(),OP_BUY,0.1,Ask,0,500,500,"123",123,0,Red);

    }

    

    return(0);

}

//-----------------------------------------------

 int OrderSendX (string symbol,int cmd, double volume,double price,int slippage,double stoploss,double takeprofit,string comment, 

                int magic,datetime expiration,color arrow_color)

{

   int err=GetLastError();

   err = 0;

   bool exit_loop = false;

   int ticket = -1;

   

   int Retry = 10;

   int cnt = 0;

   

   if(cmd == OP_BUY || cmd == OP_SELL) //проверка типа ордера на открытия

   {

       while(!exit_loop) 

       {

           ticket = OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color);

           err = GetLastError();

           

           switch(err)

           {

               case ERR_NO_ERROR:

               exit_loop = true;

               break;

               

               case ERR_SERVER_BUSY:

               case ERR_NO_CONNECTION:

               case ERR_INVALID_PRICE:

               case ERR_BROKER_BUSY:

               case ERR_TRADE_CONTEXT_BUSY:

                    cnt++;

                    break;

               

               case ERR_PRICE_CHANGED:

               case ERR_OFF_QUOTES:

               case ERR_REQUOTE:

                    RefreshRates();

                    continue;

                    

               default:

                    exit_loop = true;

                    break;

           }

           if(cnt>Retry)

           exit_loop = true;

           

           if(!exit_loop)

           {

               Sleep(1000);

               RefreshRates();

           }

           else

           {

              if(err !=ERR_NO_ERROR)

              {

                 Print("Ошибка : " + err);

              }

           }

           if(err ==ERR_NO_ERROR)

           {

               OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

               return(ticket);

           }

           

           Print("Ошибка открытия ордера после" + cnt + "попыток");

           return(-1);

       }

   }

}   

 
Leanid Aladzyeu:

Начал писать обертку для функций открытия и модиффикафий ордеров (думал исправит мой проблемы с возвратом значения от этих операторов)а там такая же проблема. 

Объясните уже в чем  дело та? ( что бы не написал всегда проблема с возратом значений от ОрдерСенд,ОрдерСелекс и МодифиОрдер)

https://docs.mql4.com/ru/trading/ordermodify

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
            if(!res)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else
               Print("Цена Stop Loss ордера успешно модифицирована.");

 OrderModify() возвращает да , нет

OrderModify - Документация на MQL4
  • docs.mql4.com
OrderModify - Документация на MQL4
 

Не кто не может объяснить.

Попробуем по другом на примере, а не копированием справки по 100 раз мне.

 

 

Как должно быть правильно? я на примере пойму исправления

                {

                     SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);

                     if(OrderStopLoss()!=SL)

                      OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);

                    } 

 неужели вставлять 

"""ticket """=  OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);   каждый раз и есть правильно?

 

И Благодарю, всех кто пытался объяснить .

К сожалению я не понимаю как обозначить переменную переменной которая предопределена как функция. 

 
Leanid Aladzyeu:

И Благодарю, всех кто пытался объяснить .

К сожалению я не понимаю как обозначить переменную переменной которая предопределена как функция. 

Уважаемый Leanid. Учитесь читать справку и работать с ошибками и предупреждениями. Если Вы не научитесь этого делать, то и программировать нормально не будете. Это основы. Вы пробовали перевести то, что написано в предупреждении? Вы понимаете смысл функций, которые "требуют проверки"? В справке описан корректный пример работы с данными функциями. Например, OrderModify(). Смотрим справку:

Возвращаемое значение

Возвращает true при успешном завершении функции или false в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). 

 и далее идет пример:

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
if(!res)
   Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
   Print("Цена Stop Loss ордера успешно модифицирована.");

Как Вы видите, возвращаемое значение функции обрабатывается в операторе if-else. Переменная res не просто так "для красоты" нужна. Это результат выполнения торговой функции! Функции, от которой зависят Ваши деньги! Соответственно, чтобы максимально корректно обработать все возможные варианты (обработка в данном примере не представлена) и нужны переменная res и код ошибки, возвращаемый функцией GetLastError(). Разработчики специально включили предупреждения как напоминание, чтобы программисты не забывали, что есть "важные" функции, на обработку значений которых нужно обратить внимание! Также заметьте, если значение не проверить ошибки не будет! Т.е., в данном случае, функция итак будет работать, но, если произойдет нештатная ситуация, ее обработки не произойдет. Список нештатных ситуаций - коды возврата функции GetLastError(). 

Надеюсь, так понятнее. 

Коды возврата торгового сервера - Документация на MQL4
  • docs.mql4.com
Коды возврата торгового сервера - Документация на MQL4
 
Leanid Aladzyeu:

Начал писать обертку для функций открытия и модиффикафий ордеров (думал исправит мой проблемы с возвратом значения от этих операторов)а там такая же проблема. 

И в данном случае не нужно писать обертку. Она не решит проблем с предупреждением о проверке возвращаемого значения! Загляните в примеры этих функций и сделайте так же!
 
Tapochun:
И в данном случае не нужно писать обертку. Она не решит проблем с предупреждением о проверке возвращаемого значения! Загляните в примеры этих функций и сделайте так же!

Как указано в справке дает ошибку.    

Я написал так и нормально

 if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))

                          {

                           Print("Модификация прошла успешно.");

                          }

                     else Print("Ошибка модификации ордера.");

 
Вставляйте код в сообщения правильно: Правильно вставляем код на форуме
 
Karputov Vladimir:
Вставляйте код в сообщения правильно: Правильно вставляем код на форуме
вот...
 
Leanid Aladzyeu:

Почему Тралинг не работает на продажу ? на покупку работает!

Ошибок и предупреждений нет , при генетической компиляции. 

Вот код:

void Trailing()
  {
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()-Ask>TrailingStop*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
           }
        }
     }
  }

 

Причина обращения: