Проблема ввода нескольких ордеров для реального счета у конкретного брокера - страница 3

 
figurelli:
Здравствуйте,FinanceEngineer, возможно, было бы лучше начать проверку проблемы множественных ордеров в вашем оригинальном коде, так как если мы это сделаем, возможно, мы рассмотрим другие критические моменты здесь и не потеряем фокус, что вы думаете об этом?

Здравствуйте, Фирелли

Это мой новый код. Я изменил его после того, как поднял вопрос о множественных ордерах в этой теме.

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

for(int i=0;i<10;i++)
   {

      
 
      if(volume<=0.0) break;
      

      if(Type==POSITION_TYPE_SELL)
      {
         request.type=ORDER_TYPE_SELL;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_BID);
         
         if(TP!=0) takeprofit = request.price-TP*mPoint;
         if(SL!=0) stoploss = request.price+SL*mPoint;
      }
      
      
      if(Type==POSITION_TYPE_BUY)
      {
         request.type=ORDER_TYPE_BUY;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_ASK);

         if(TP!=0) takeprofit = request.price+TP*mPoint;
         if(SL!=0) stoploss = request.price-SL*mPoint;
      }
      
      
      
      
      request.action          = TRADE_ACTION_DEAL;
      request.symbol        = mSymbol;
      request.volume        = MathMin(volume,SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_MAX));
      request.sl                = stoploss;
      request.tp               = takeprofit;
      request.deviation     = SymbolInfoInteger(mSymbol,SYMBOL_SPREAD);
      request.type_filling   = ORDER_FILLING_FOK;
      request.comment     = strComment;
      request.magic         = EAMagic;
      
      
      
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
      

      
      bool checkOrderSend = OrderSend(request, result);
      
      if(result.retcode==10009 || result.retcode==10008)
      { 
          Print("OrderSend was successful. Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.

          
          break;
      }
      else
      {
          Print(ResultRetcodeDescription(result.retcode));
      }
      

      Sleep(1000);
      
   }
   

 

 
 
FinanceEngineer:

Здравствуйте, Фирелли

Это мой новый код. Я изменил его после того, как поднял вопрос о множественных ордерах в этой теме.

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

Пожалуйста, используйте кнопку SRC при размещении кода.

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

 
angevoyageur:

Пожалуйста, используйте кнопку SRC при размещении кода.

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

Что было бы лучше, если есть решение, кроме установки 10 часов сна внутри цикла?
 
FinanceEngineer:

Здравствуйте, Фирелли

Это мой новый код. Я изменил его после того, как поднял вопрос о множественных ордерах в этой теме.

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

Привет,FinanceEngineer, обратите внимание, что в вашем первоначальном коде у вас есть Print("OrderSend Code: "...) в if { } и else { }.

Но else { } имеет прерывание, а ваш отладочный код показывает retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

То есть, судя по всему, вы выводили отладочное условие if { } и ваш break никогда не использовался.

if(!OrderSend(request,result) || result.deal==0 )
      {
         Print("OrderSend Code: ",result.retcode);
         if(result.retcode==TRADE_RETCODE_TRADE_DISABLED) break;
         if(result.retcode==TRADE_RETCODE_MARKET_CLOSED) break;
         if(result.retcode==TRADE_RETCODE_NO_MONEY) break;
         if(result.retcode==TRADE_RETCODE_TOO_MANY_REQUESTS) Sleep(5000);
         if(result.retcode==TRADE_RETCODE_FROZEN) break;
         if(result.retcode==TRADE_RETCODE_CONNECTION) Sleep(15000);
         if(result.retcode==TRADE_RETCODE_LIMIT_VOLUME) break;
         
      }
      else if(result.retcode==10009 || result.retcode==10008)
      { 
          Print("OrderSend Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
          
          if(Type == POSITION_TYPE_BUY) {mBuyPositionCnt = mBuyPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          if(Type == POSITION_TYPE_SELL) {mSellPositionCnt = mSellPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          break;
      }

Теперь вы изменили код, и он выглядит более понятным, но обратите внимание, что вы больше не проверяете возвращаемое значение OrderSend(), только result.retcode. Это можно исправить с помощью переменной checkOrderSend (*** смотрите здесь), о которой я спрашивал ранее:

      bool checkOrderSend=OrderSend(request,result);

      if(checkOrderSend) // (*** look here)
        {
         if(result.retcode==10009 || result.retcode==10008)
           {
            Print("OrderSend was successful. Code: ",result.retcode);
            volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
            break;
           }
         else
           {
            Print(ResultRetcodeDescription(result.retcode));
           }
        }
      else 
        {
         Print("OrderSend execution error.");
        }

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

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

Надеюсь, эта информация поможет вам.

 
figurelli:

Здравствуйте,FinanceEngineer, обратите внимание, что в вашем первоначальном коде у вас есть Print("OrderSend Code: "...) в if { } и else { }.

Но else { } имеет прерывание, а ваш отладочный код показывает retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

То есть, судя по всему, вы выводили отладочное условие if { } и ваш break никогда не использовался.

Теперь вы изменили код, и он выглядит более понятным, но обратите внимание, что вы больше не проверяете возвращаемое значение OrderSend(), только result.retcode. Вы можете исправить это с помощью переменной checkOrderSend (*** смотрите здесь), о которой я спрашивал ранее:

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

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

Надеюсь, эта информация поможет вам.

Что насчет возвращаемого кода 10010?

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

 
angevoyageur:

А как насчет возвращенного кода 10010?

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

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

Однако, если вы спрашиваете автора кода, как насчет того, чтобы спросить напрямую у него?

 
figurelli:

Здравствуйте,FinanceEngineer, обратите внимание, что в вашем первоначальном коде у вас есть Print("OrderSend Code: "...) в if { } и else { }.

Но else { } имеет прерывание, а ваш отладочный код показывает retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

То есть, судя по всему, вы выводили отладочное условие if { } и ваш break никогда не использовался.

Теперь вы изменили код, и он выглядит более понятным, но обратите внимание, что вы больше не проверяете возвращаемое значение OrderSend(), только result.retcode. Вы можете исправить это с помощью переменной checkOrderSend (*** смотрите здесь), о которой я спрашивал ранее:

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

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

Надеюсь, эта информация поможет вам.

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

Я знаю, что это звучит странно. Когда я проверял возвращаемое значение OrderSend(request,result) в предыдущем коде, я получал проблему множественного заказа. Теперь в моем новом коде я не проверяю возвращаемое значение OrderSend(request,result) (но я все же присвоил возвращаемое значение некоторой переменной, чтобы избежать ошибки на новой сборке терминала.

С новым кодом я не получаю проблемы с множественными ордерами. Я использовал Alpari UK, который имеет репутацию отправителя большого количества тиков. Возможно, мой код не идеален, но подумайте вот о чем. В Meta Trader 5 есть довольно много возвращаемых кодов, которые необходимо проверить.

Первый из них - возвращаемое значение из OrderCheck, второй - возвращаемое значение из OrderSend и третий - возвращаемое значение, присвоенное в result.retcode. Я думаю, что какими бы ни были первые два возвращаемых значения, больше всего нас должно волновать последнее, плюс количество фактически выполненного объема.

Поэтому, основываясь на этом факте, я упростил свой код, просто перейдя к проверке result.retcode. Пожалуйста, поправьте меня, если я ошибаюсь. Я думаю, что исполнение ордеров в MT5, безусловно, намного сложнее, чем в MT4, и многие из нас запутались.

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

С уважением.

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

Однако, если вы спрашиваете автора кода, как насчет того, чтобы обратиться непосредственно к нему?

Я обратился ко всем, кто участвует в этой теме. Я пропустил ваше сообщение о коде 10010, где он?

 
angevoyageur:

Я обратился ко всем, кто участвует в этой теме. Я пропустила ваше сообщение о коде 10010, где он находится?

Привет Алена,

Мне не совсем понятно, что вам нужно знать, так как речь идет только о новом коде FinanceEngineer, и совет о проверке кода возврата OrderSend(), который был изменен по сравнению с оригинальным кодом.

Обратите внимание, что ни его оригинальный код, ни его новый код не имеют теста кода 10010, так что если это имеет отношение к вам, почему вы не спросили с самого первого его сообщения?

В любом случае, не могли бы вы объяснить, зачем нужен код 10010 test для полиса заполнения FOK?

Поскольку это уже не первый раз, когда я вижу, как вы и другие модераторы говорят об этом, знаете ли вы случаи, когда действительно необходим этот код-тест для ордеров FOK (Fill Or Kill), которыми вы могли бы поделиться с нами?

Заранее спасибо.

 
FinanceEngineer:

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

Я знаю, что это звучит странно. Когда я проверял возвращаемое значение OrderSend(request,result) в предыдущем коде, я получал проблему множественного заказа. Теперь в моем новом коде я не проверяю возвращаемое значение OrderSend(request,result) (но я все еще присваиваю возвращаемое значение некоторой переменной, чтобы избежать ошибки на новой сборке терминала.

С новым кодом я не получаю проблемы с множественными ордерами. Я использовал Alpari UK, который имеет репутацию отправителя большого количества тиков. Возможно, мой код не идеален, но подумайте вот о чем. В Meta Trader 5 есть довольно много возвращаемых кодов, которые необходимо проверить.

Первый из них - возвращаемое значение из OrderCheck, второй - возвращаемое значение из OrderSend и третий - возвращаемое значение, присвоенное в result.retcode. Я думаю, что какими бы ни были первые два возвращаемых значения, больше всего нас должно волновать последнее, плюс количество фактически выполненного объема.

Поэтому, основываясь на этом факте, я упростил свой код, просто перейдя к проверке result.retcode. Пожалуйста, поправьте меня, если я ошибаюсь. Я думаю, что исполнение ордеров в MT5, безусловно, намного сложнее, чем в MT4, и многие из нас запутались.

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

С уважением.

  • Пропуск кода возврата OrderSend() не имеет никакого отношения к проблеме двойных ордеров. Простое совпадение.
  • OrderCheck() также не имеет отношения к проблеме, так как это только предотвращение некоторых ошибок ДО отправки ордера.
  • Если OrderSend() возвращает false, вы знаете, что возникла проблема, поэтому вы можете проверить, какая именно, и обработать ее в соответствии с вашими потребностями.
  • Если OrderSend() вернул true, начинаются трудности... см. следующее сообщение.