Советник не запускается на нескольких парах, нужна помощь - страница 2

 
Fernando Carreiro:

Еще одно очень важное замечание по поводу использования вашего советника на нескольких валютных парах или тайм-фреймах.

Ваш код не использует выбор "магического числа" и не проверяет используемый символ (или "магическое число") при проверке открытых ордеров в истории. Таким образом, по сути, ваш советник не будет корректно работать ни с самим собой, ни с другими советниками.

В таком виде советник можно использовать только сам по себе, без других советников, даже на другом графике!

Большое спасибо за помощь с моим кодом и уделенное время, я постараюсь внести необходимые изменения.
 
Keith Watford:

    bool ans;

   

         //You do not select an order

         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)                                 //Use if not while
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)                                        //ticket is a local variable and has not been assigned a value
             {     
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());   
             }   
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
Перепишите раздел кода, посвященный закрытию заказа, чтобы он был логичным, здесь вообще не должна использоваться переменная ticket.
Во время написания этой статьи у меня не было переменной ticket, я просто хотел узнать, повлияет ли ее наличие на работу кода, и спасибо за ваш вклад и время.
 
Matt_Townsend:
Большое спасибо за помощь с моим кодом до сих пор и ваше время, я постараюсь внести необходимые коррективы.

Поскольку у вас слишком много логических проблем в вашем советнике, я предлагаю вам взглянуть на примеры кода от MetaQuotes, а именно"Moving Average.mq4" и/или "MACD Sample.mq4" и строить на их основе, пока вы не поймете основные принципы работы советника.

Я прикрепил файлы, но вы найдете их в папке "MQL4\Experts".

Файлы:
 
Fernando Carreiro:

EDIT: Что касается кода, вы используете OrderSelect, но вы всегда предполагаете, что он работает каждый раз. А когда он не срабатывает, вы просто продолжаете использовать функции деталей заказа, такие как OrderTicket() в вашем закрытии, которые могут потерпеть неудачу, если первоначальный OrderSelect() тоже не сработал.

После того, как я обратил внимание на ваше редактирование.....

Я всегда предполагал, что OrderSelect() будет потерян при появлении нового тика.

Поэтому я проверил и обнаружил, что если ордер выбран, то он остается выбранным даже при последующих новых тиках.

Каждый день узнаю что-то новое :)

 
Keith Watford: После того, как заметил вашу правку.....

Я всегда предполагал, что OrderSelect() будет потерян при новом тике.

Поэтому я проверил и обнаружил, что если ордер выбран, то он остается выбранным даже при последующих новых тиках.

Каждый день узнаю что-то новое :)

На практике, однако, это мало полезно, так как эти детали замораживаются во времени, поэтому такие вещи, как OrderClosePrice() не будут обновляться, пока вы не выберете его снова!
 
Использование OrdersTotal напрямую и/или отсутствие фильтрации магических чисел в циклеOrderSelect означает, что ваш код несовместим с любым советником (включая себя на других графиках и ручную торговлю). Symbol Doesn't equal Ordersymbol when another currency is added to another seperate chart . - Форум MQL4
 
Fernando Carreiro:

Еще одно очень важное замечание по поводу использования вашего советника на нескольких валютных парах или тайм-фреймах.

Ваш код не использует выбор "магического числа" и не проверяет используемый символ (или "магическое число") при проверке открытых ордеров в истории. Таким образом, по сути, ваш советник не будет корректно работать ни с самим собой, ни с другими советниками.

В таком виде этот советник можно использовать только сам по себе, без других советников, даже на другом графике!


    for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
         //---Check Order Type
         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }
      if(OrderType()==OP_SELL)
        {
          if(fastma > slowma)
          {
             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
            
          }
          else
               Print("Error : ", GetLastError());
               return(0);
          break;
        }

      } 

Вот секция OrderClose, я больше не получаю ошибку недействительного тикета, но теперь я получаю недействительную цену.

Вот прямо из журнала

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: invalid price 1.05454000 for OrderClose function


 
Matt_Townsend:

           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }

...

         {

             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);

 

Вот раздел OrderClose, я больше не получаю ошибку недействительного билета, но теперь я получаю недействительную цену.

Вот прямо из журнала

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: invalid price 1.05454000 for OrderClose function


Не используйте Bid/Ask при закрытии, используйте OrderClosePrice(). Это будет автоматически хорошая цена.
 
Alain Verleyen:
Не используйте Bid/Ask при закрытии, используйте OrderClosePrice(). Это будет автоматически хорошая цена.

Должен ли я просто заменить его в функции OrderClose? И если да, то должен ли я удалить OrderClosePrice в функции print под ним?

Редактировать:

Я только что сделал это, но теперь он не удерживает ни одной открытой позиции. Просто открывает и закрывает позиции, хотя теперь у него нет проблем с работой на нескольких парах.

 

         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }

Нет необходимости в возврате или прерывании, так как вам нужно завершить цикл.

Кроме того, ваша ошибка зависит от того, что


           if(fastma < slowma)


false, а не от того, не сработала ли функция OrderClose().



   if(OrderType()==OP_BUY)
     {
      if(fastma<slowma)
        {
         if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
            Print("Order Closed : ",OrderClosePrice());
         else
            Print("Error : ",GetLastError())
        }
     }


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