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

 
Я очень новичок в кодировании mql4, и я закончил свой первый советник. Моя единственная проблема теперь заключается в том, что я не могу заставить его открывать сделки более чем на одной паре. В разделе советника на терминале рядом с журналом, он посылает поток ошибки, invalid ticket for orderclose function, хотя советник прекрасно открывает и закрывает сделки на одной паре. Не мог бы кто-нибудь помочь.
 
Matt_Townsend:
Я очень новичок в кодировании mql4 и уже создал свой первый советник. Моя единственная проблема заключается в том, что я не могу заставить его открывать сделки более чем на одной паре. В разделе советника на терминале рядом с журналом, он посылает поток ошибки, invalid ticket for orderclose function, хотя советник прекрасно открывает и закрывает сделки на одной паре. Не мог бы кто-нибудь помочь.

Как вы ожидаете, что мы узнаем, если вы не покажете ни свой код, ни журнал ошибок?

Мы не читаем мысли! Если вы хотите получить нашу помощь, вам придется показать ваш код, а также ошибки, которые он выдает (результаты в журнале). Также будет полезно узнать, на каких валютных парах и таймфреймах вы тестируете, когда мы посмотрим на ваш код.

Также, пожалуйста, обратите внимание, что на MetaTrader 4 в тестере стратегий можно одновременно тестировать только одну валюту. Если ваш советник торгует несколькими валютами одновременно с одного графика, вы не сможете протестировать его в тестере стратегий - только на реальном или демо-счете!

 
Matt_Townsend: даже если советник прекрасно открывает и закрывает сделки на одной паре.
Вот почему я рекомендую
Не торгуйте несколькими валютами в одном советнике
 
Matt_Townsend: Вот мой код, и у меня есть проблема на живом демо, я даже пытался посмотреть, могу ли я использовать несколько терминалов, чтобы решить проблему. Спасибо за ваши отзывы.

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

EDIT: Как и просили ранее - . .. Также будет полезно узнать, на каких валютных парах и таймфреймах вы тестируете ...

EDIT2: Как и просили ранее- ... а также ошибки, которые он выдает (результаты в журнале) ...

 
Fernando Carreiro:
Пожалуйста, отредактируйте свое сообщение и используйте кнопку SRC, чтобы добавить свой код! Не копируйте/вставляйте стандартный текст, так как его трудно читать. Я уверен, что вы можете видеть из других тем, как это должно быть сделано. Пожалуйста, используйте кнопку SRC для размещения вашего кода.
//+------------------------------------------------------------------+
//|                     Simple Moving Average Crossover Strategy.mq4 |
//|                                                 Matthew Townsend |
//+------------------------------------------------------------------+
#property version   "1.05"
#property strict
//---

//---Inputs
extern  double Lots         =0.01;
extern  int    FastMA       =5;
input   int    FastMAMode   =MODE_EMA;
extern  int    SlowMA       =8;
input   int    SlowMAMode   =MODE_SMA;

//+----------------------------------------+
//|undesirables                            |
//+----------------------------------------+
int init()
{
   //----
   //----
   return(0);
}

int deinit()
{
   //----
   //----
   return(0);
}
//+---------------------------------------------+
//|System start                                 |
//+---------------------------------------------+
int start()
{


    double fastma, slowma;
    int    ticket, total;
    //---define Ma's
    
    fastma = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
    slowma = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
    
    total = OrdersTotal();
    //---Start operations
    
    if(total < 1)
    {
       if(fastma > slowma)
       {
         ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"",0,0,Blue);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Buy order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       if(fastma < slowma)
       {
         ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"",0,0,Red);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Sell order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       return(0);
    }
    bool ans;
    
        
         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)
             {      
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());    
             }    
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
      if(OrderType()==OP_SELL)
        {
          while(fastma > slowma)
          {
             ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
             if(ticket < 1)
             {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("Sell order closed : ", OrderClosePrice());
              
             }
             else
               Print("Error closing order : ", GetLastError());
               return(0);
          }
          
        }
    
    return(0);
}

//+-----------------------------------------------------------------------------------+
 
Fernando Carreiro:
Я попросил вас отредактировать предыдущее сообщение, а не добавлять новое, чтобы не делать тему такой длинной!
Извините, я тоже новичок на этом форуме, могу ли я удалить эти 2 сообщения?
 
Matt_Townsend:
Я тестировал на 1-часовом таймфрейме, EURUSD и 1-часовом GBPUSD.
Для следующего кода уже есть два предупреждения компилятора:
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

Вы неправильно проверяете результат операции закрытия.

С точки зрения логики в вашем советнике есть несколько проблем, но на данный момент он работает без ошибок с моей стороны в тестере стратегий, поэтому, пожалуйста, предоставьте список ошибок, которые вы получаете!

 
Fernando Carreiro:
Для следующего кода уже есть два предупреждения компилятора:
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

Вы неправильно проверяете результат операции закрытия.

С точки зрения логики в вашем советнике есть несколько проблем, но на данный момент он работает без ошибок с моей стороны, поэтому, пожалуйста, предоставьте список ошибок, которые вы получаете!

Единственная ошибка, которую я получаю от советника -invalid ticket for orderclose function, с цифрой рядом, Я бы хотел показать фактический лог, но на втором графике с запущенным советником он ничего не делает, так как обычно он пытается открыть сделку немедленно. Если и когда журнал начнет заполняться ошибкой, как мне показать вам фактический журнал?
 
Matt_Townsend:
Единственная ошибка, которую я получаю от советника, этоinvalid ticket for orderclose function, с цифрой рядом, я бы хотел показать фактический лог, но на втором графике с запущенным советником он ничего не делает, так как обычно он пытается открыть сделку немедленно. Если и когда журнал начнет заполняться ошибкой, как мне показать вам фактический журнал?

Выделите нужные линии с помощью Click, Ctrl-Click или Shift-Click (стандартная операция windows), затем щелкните правой кнопкой мыши по выделению и выберите "Copy"!

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

 

    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 здесь вообще.
 
Matt_Townsend:
Единственная ошибка, которую я получаю от советника -invalid ticket for orderclose function, с цифрой рядом, я бы хотел показать фактический лог, но на втором графике с запущенным советником он ничего не делает, так как обычно он пытается открыть сделку немедленно. Если и когда журнал начнет заполняться ошибкой, как мне показать вам фактический журнал?

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

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

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