Проблема множественных заказов - страница 4

 
luisneves:

Привет, Кронин,

Ваша модификация работает. Вы ограничили максимальное количество ордеров, но можно ли сделать так, чтобы все они закрывались?

Я пытался сделать это с помощью следующего кода, но, похоже, не работает.

С наилучшими пожеланиями

Луис

Хммм, я не уверен, что понимаю, что вы имеете в виду...
Вы имеете в виду, что вместо того, чтобы открыть последний ордер (ордер 7, если MaxOrders установлен на 7), закрыть все ордера?

Я совершенно уверен, что вы не хотите ждать, пока MaxOrders будет достигнут, а затем сразу же закрыть все. Последний ордер в большинстве случаев (или во всех случаях) закончится с убытком.
Кстати, вы видели сообщение PM о контроллере спреда?

 
kronin:

Хммм, я не уверен, что понимаю, что вы имеете в виду...
Вы имеете в виду, что вместо того, чтобы открыть последний ордер (ордер 7, если MaxOrders установлен на 7), закройте все ордера?

Я совершенно уверен, что вы не хотите ждать, пока MaxOrders будет достигнут, а затем сразу же закрыть все. Последний ордер в большинстве случаев (или во всех случаях) закончится с убытком.
Кстати, вы видели сообщение PM о контроллере спреда?


Привет, Кронин,

Спасибо за быстрый ответ.

Скажем, после цикла пинг-понга из n ордеров (MaxOrders) все открытые ордера должны быть закрыты, я знаю, что это не имеет смысла, но даже так.

Я пытаюсь включить код для повторного входа в ордер в случае неудачи и сомневаюсь, имеет ли это смысл, потому что уже есть код IsContextBusy () Sleep (10). Насколько я понимаю, смысл в том, что "если сервер занят или другой советник в платформе пытается связаться, то подождите 10 миллисекунд и попробуйте снова". Таким образом, я предполагаю, что советник будет вести себя так до тех пор, пока не будет получен тикет, я прав?

Что касается вопроса PM, в таком случае лучше не использовать тест в выходные или делать это с платформой offline.....

Я вставил строку 5, но думаю, что в этом нет необходимости, потому что строка 1 у вас уже есть, я прав?

int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber); //1 
   if(LastClosedTicket>0)
    {                                                                 
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))
      {
      if(OrderSymbol()== Symbol() && OrderMagicNumber()== MagicNumber) //5           
       {            
         if(OrderType()==OP_BUY)
         {
         BuyAllowed=false;SellAllowed=true;
         } 
         else                   
         {
         BuyAllowed=true;SellAllowed=false;
         } 
        }   
      }
    }             
  return(0);   
  }
 
  //+---------------------------------------------------------------------------+

Еще один вопрос,

В следующем куске кода строки, выделенные жирным шрифтом, где есть sym и mn, не нужно заменять на Symbol() и MagicNumber?

GetTicketFromHistory

int GetTicketFromHistory(string sym,int mn,int orderposinhistory=0)// <------------------------Should replace sym and mn with Symbol () and MagicNumber ?
 {
   bool debug=false;
   if(debug)Print("Orders in history: ", OrdersHistoryTotal());
   int ticket,count=1,i;
   datetime orderclosedates[];
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(debug)Print("OrderSymbol: ",OrderSymbol(),"; OrderMagicNumber: ",OrderMagicNumber(),
                     " ;OrderType: ",OrderType(),"; OrderTicket: ",OrderTicket(),
                     "; OrderCloseTime: ",TimeToStr(OrderCloseTime()),";"); 
      if((OrderMagicNumber()  ==mn) // <---------------------------------------------------------Should replace  mn with  MagicNumber ?
         &&(OrderSymbol()     ==sym)// <---------------------------------------------------------Should replace sym with Symbol () ?
         &&(OrderType()==OP_BUY||OrderType()==OP_SELL))
         {                       
         ArrayResize(orderclosedates,count);
         orderclosedates[count-1]=OrderCloseTime();
         count++;

Здесь, в следующем коде я вставил фильтры, как вы посоветовали;

(//Фил:

//Проверяем общее количество ордеров. Я бы добавил фильтр для рынка, магии и символа...//<----------- Не уверен, что вы имеете в виду фильтр рынка..... (Фил: рыночные ордера, без отложенных ордеров)

//.... но я ленив сейчас..... это то, что вы должны сделать.

Это правильно?

int start()
 {//0 
                                         
  OTLastTick = OTCurrentTick;                      
  OTCurrentTick = OrdersTotal();
     if(OrderSymbol() == Symbol()           //<--------filter for symbol and magic number, but for market (suppose market orders can't understand how....)
      && OrderMagicNumber() == MagicNumber) //<-|
     if(OTCurrentTick == 0 && OTLastTick > 0)
      {
      BuyTrigger = Ask + OpenDistance * pt;
      SellTrigger = Bid - OpenDistance * pt;
      }             
     if(OTCurrentTick >0 )Trail();                   
     if(OTLastTick >= 2                     //<------could you comment the meaning of this line ?                            
     &&OTCurrentTick < OTLastTick
     && OTCurrentTick > 0)
     {
      CloseAllOnSL();return;
     }      
     if(OTCurrentTick >= MaxOrders)return;                                                            
     if(OTCurrentTick > 0)OpenOppositeOrder();                        
     if(OTCurrentTick == 0)
     {
      BuyAllowed = true;
      SellAllowed = true;


С наилучшими пожеланиями

Луис

 

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

OrdersTotal() возвращает количество ордеров. Вы, вероятно, хотите знать, принадлежат ли эти ордера вашему советнику или ручной торговле, отложены ли они или уже являются рыночными. Я бы создал функцию (int), которая бы выдавала количество ордеров, созданных советником.

if(OTLastTick >= 2 //<------could you comment the meaning of this line ?
Если у вас открыт только один ордер (меньше 2), то нет смысла вызывать функцию CloseAllOnSL..... единственный открытый ордер явно не остановлен.

 
kronin:

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

OrdersTotal() возвращает количество ордеров. Вероятно, вы хотите знать, принадлежат ли эти ордера вашему советнику или ручной торговле, отложены ли они или уже являются рыночными ордерами. Я бы создал функцию (int), которая бы выдавала количество ордеров, созданных советником.

if(OTLastTick >= 2 //<------ не могли бы вы прокомментировать смысл этой строки?
Если у вас открыт только один ордер (меньше 2), то нет смысла вызывать функцию CloseAllOnSL..... единственный открытый ордер явно не остановлен.


Привет Кронин,

Спасибо за ваш ответ на мои вопросы.

Я обращу самое пристальное внимание на ваш код, а также на советы RaptorUK, данные ранее.

С наилучшими пожеланиями

Луис

 

Привет, Кронин,

Возникла проблема, связанная с использованием двух советников. Если я помещаю два советника на разные графики и с разными магическими числами, они не работают одновременно. Я получаю ошибку uninit reason 5, но посмотрев форум, не могу найти информацию, которая направила бы меня в правильное русло для решения этой проблемы.

Есть ли у вас какая-нибудь дополнительная информация?

С наилучшими пожеланиями

Луис

 
luisneves:

Привет, Кронин,

Возникла проблема, связанная с использованием двух советников. Если я помещаю два советника на разные графики и с разными магическими числами, они не работают одновременно. Я получаю ошибку как uninit reason 5

https://docs.mql4.com/constants/uninit
 

Здравствуйте, RaptorUK,

Спасибо за быстрый ответ.

В предоставленной ссылке я нашел,

ПАРАМЕТРЫ ПРИЧИНЫ5Входные параметры были изменены пользователем.

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

Кстати, раз уж Вы здесь, подскажите, нужно ли в следующем коде вводить код для того, чтобы ордера отправлялись снова, пока тикет не получен, то же самое для закрывающих ордеров?

while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)

С наилучшими пожеланиями

Луис

 
luisneves:

Здравствуйте, RaptorUK,

Спасибо за быстрый ответ.

В предоставленной ссылке я нашел,

ПАРАМЕТРЫ ПРИЧИНЫ5Входные параметры были изменены пользователем.

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

Если вы изменили магическое число ....

extern int    MagicNumber    = 08012013;

...и это внешнее число, то вы изменили параметр, советник перезапускается и выдает причину 5.

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

 
RaptorUK:

Если вы изменили магическое число ....

... и это внешнее число, то вы изменили параметр, советник перезапускается и выдает причину 5

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


Привет RaptorUk,

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

Что касается другого вопроса о повторном вводе ордеров, это связано с ошибкой при закрытии ордера, которая вернула ошибку как таймаут. Поэтому я не знаю, будет ли код в его нынешнем виде повторно вводить закрытие ордера или отправку ордера.

С наилучшими пожеланиями

Луис

 
luisneves:


Привет RaptorUk,

Спасибо за ваш ответ об ошибке, я полагаю, что изменил имя и магический номер и поместил вторую ea на график без закрытия платформы.

Что касается другого вопроса о повторном вводе ордеров, это связано с ошибкой при закрытии ордера, которая вернула ошибку как таймаут. Поэтому я не знаю, будет ли код в его нынешнем виде повторно вводить закрытие ордера или отправку ордера.

С наилучшими пожеланиями

Луис

Прочитайте коды ошибок исполнения и приведите свой код в соответствие с приведенной там информацией, например, ....

ERR_TRADE_TIMEOUT128Достигнут тайм-аут для торговли. Перед повторной попыткой(по крайней мере, в 1-минутном времени), необходимо убедиться, что торговая операция не была действительно успешной (не была открыта новая позиция, или существующий ордер не был изменен или удален, или существующая позиция не была закрыта).
Причина обращения: