Обсуждение статьи "Пошаговое руководство по написанию советников в MQL5 для начинающих" - страница 17

 
Очень хорошо! Спасибо!
 

Я скачал файл и отладил код, и он показал это предупреждение, может ли кто-нибудь помочь мне с этим?


Возвращаемое значение'OrderSend' должно быть проверено


 

Здравствуйте, я новичок и тоже тестирую Робота.

Попробуйте следующее:

// OrderSend(mrequest,mresult);

bool res=OrderSend(mrequest,mresult);

// получаем код результата

if(res && (mresult.retcode==10009 || mresult.retcode==10008)) //Запрос выполнен или заказ размещен

{

Alert("Ордер на покупку был успешно размещен на Ticket#:",mresult.order,"!!!");

}

else

{

Alert("Запрос на покупку не был завершен - ошибка:",GetLastError());

ResetLastError();

return;

}

Если я ошибаюсь, пожалуйста, поправьте меня!

Источник исследования: https://www.mql5.com/en/forum/23663

return value of 'OrderSend' should be checked
return value of 'OrderSend' should be checked
  • 2014.05.03
  • www.mql5.com
Hi ! I'm wondering how to do that ...:/ the warning appeared @ the last update...
 

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



 
northedan:

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



Я думаю, что пример в валютах, поэтому переменная lot, которая равна 0.1, не подходит для вашего теста, попробуйте изменить ее следующим образом (изменив переменную mrequest.volume):


double minSymbolLot = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);

mrequest.action = TRADE_ACTION_DEAL; // немедленное исполнение ордера

mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // последняя цена спроса

mrequest.sl = NormaliseDouble(latest_price.ask - STP*_Point,_Digits); // стоп-лосс

mrequest.tp = NormaliseDouble(latest_price.ask + TKP*_Point,_Digits); // Тейк-профит

mrequest.symbol = _Symbol; // валютная пара

mrequest.volume = minSymbolLot; // количество лотов для торговли

mrequest.magic = EA_Magic; // магический номер ордера

mrequest.type = ORDER_TYPE_BUY; // ордер на покупку

mrequest.type_filling = ORDER_FILLING_FOK; // Тип исполнения ордера

mrequest.deviation = 100;

 
Кто-нибудь знает, могу ли я использовать этот советник для мини-индексов или мини-долларов?
 
Sella170:
Кто-нибудь знает, можно ли использовать этот советник для мини-индексов или мини-долларов?

Поняли ли вы стратегию? Знаете ли вы о рисках? Проанализировали ли вы уровни SL и TP? Знаете ли вы используемые технические индикаторы? Знаете ли вы, как их параметризовать? Знаете ли вы, как настроить переменные для каждого актива (WIN и WDO)?

Сам код был разработан для любого актива, и вы можете определить это через "_Symbol" и для любого времени графика "_Period".

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

[ ]'s

 

Ребята,

Это простой быстро модифицированный код, если у вас есть ошибка с несколькими ордерами, открывающимися в одно и то же время.

Замените этот код: со строки 167 -177

   if(PositionSelect(_Symbol)==true) // у нас есть открытая позиция
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  //Купить
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // Это продажа
        }
     }

этим:

   int total= PositionsTotal();
   for(int i=0;i<total;i++)
     {
      if(PositionGetSymbol(i)==_Symbol);
        {
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
           {
            Buy_opened=true;  //Купить
           }
         else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
           {
            Sell_opened=true; // Это продажа
           }
        }
      }

Спасибо @Samuel Olowoyo

 
Korobejnik:

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

Советник не видит что уже есть открытые позиции Buy и Sell и открывает новые, несмотря на то что в коде есть проверка

на уже открытые позиции. Проверка почему то не срабатывает.

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

Ребята, это простой быстро модифицируемый код, если у вас есть ошибка с несколькими ордерами, открывающимися одновременно. Заменить этот код: из строки 167 -177

   if(PositionSelect(_Symbol)==true) // we have an opened position
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  //It is a Buy
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // It is a Sell
        }
     }

с этим:

   int total= PositionsTotal();
   for(int i=0;i<total;i++)
     {
      if(PositionGetSymbol(i)==_Symbol);
        {
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
           {
            Buy_opened=true;  //It is a Buy
           }
         else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
           {
            Sell_opened=true; // It is a Sell
           }
        }
      }
 
Locus_Neminis:

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

Ребята, это простой быстро модифицируемый код, если у вас есть ошибка с несколькими ордерами, открывающимися одновременно. Заменить этот код: из строки 167 -177

с этим:

Это не поможет. У меня в профиле есть тема на этот счёт. Там есть причина и решение проблемы.
Про троллей не понял.