Проблема множественных заказов - страница 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-минутном времени), необходимо убедиться, что торговая операция не была действительно успешной (не была открыта новая позиция, или существующий ордер не был изменен или удален, или существующая позиция не была закрыта).