Обсуждение статьи "Реализация Take Profit в виде лимитных ордеров без изменения оригинального кода советника" - страница 6

 
it gives me <Stack Overflow> error! And the problem is in the library file:
<LimitTakeProfit.mqh>
Anyone figured out what went wrong?
 

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

Кто-нибудь еще натыкался на ошибку" переполнениестека "?

Я думаю, что проблема кроется в библиотеке "LimitTakeProfit.mqh"!!!

 

Здравствуйте Дмитрий,


Спасибо за интересную статью!


Не могли бы вы объяснить ошибку "paramter passed as reference, variable expected", связанную с каждой из следующих строк (строка 54, 55, 56)?


CSymbolInfo CLimitTakeProfit::c_Symbol = new CSymbolInfo();

CArrayLong CLimitTakeProfit::i_TakeProfit = new CArrayLong();

CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


Спасибо!

 
Mario Marconi CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


Спасибо!

Здравствуйте, а вы используете?

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>
 
Dmitriy Gizlyk #:

Здравствуйте, вы используете?

Здравствуйте Дмитрий,

На вашем "LimitTakeProfit.mqh" точно написаны следующие строки:

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>

Точнее, такая ошибка "paramter passed as reference, variable expected" возникает при компиляции вашего советника " MACD Sample LImitTP.mq5".


Спасибо за ответ!

 
Mario Marconi #:

Привет, Дмитрий,

В вашем "LimitTakeProfit.mqh" точно написаны следующие строки:

Точнее, такая ошибка "paramter passed as reference, variable expected" возникает при компиляции вашего советника " MACD Sample LImitTP.mq5".


Спасибо за ответ!

Здравствуйте, необходимо добавить * перед папраметром

CSymbolInfo    * CLimitTakeProfit::c_Symbol       =  new CSymbolInfo();
CArrayLong     * CLimitTakeProfit::i_TakeProfit   =  new CArrayLong();
CArrayDouble   * CLimitTakeProfit::d_TakeProfit   =  new CArrayDouble();
 
Dmitriy Gizlyk #:

Привет, вы должны добавить * перед папраметром

Здравствуйте Дмитрий,


Что-то не получается, те же три строки выдают следующие ошибки:

- параметр передан как ссылка, ожидается переменная LimitTakeProfit.mqh 54 57

- переопределение; разные модификаторы типа LimitTakeProfit.mqh 54 35


Спасибо за ответ!

 

Здравствуйте, Дмитрий,

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

Кажется, я нашел небольшую ошибку в опубликованном коде. На полпути к функции SetTakeProfits мы находим эту строку:

switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))

Это внутри цикла по всем ТП. Проблема в том, что позже в цикле вызывается функция CheckLimitOrder, которая в свою очередь вызывает функцию CheckOrderInHistory, и там может быть выбрана другая позиция. Это означает, что в следующей итерации цикла "переключатель" в приведенном выше коде может быть другим.

Чтобы решить эту проблему, я считаю, что position_type должен храниться в переменной до начала цикла. Таким образом:

bool CLimitTakeProfit::SetTakeProfits(ulong position_ticket, double new_tp=0)

// (...)

   double position_volume=PositionGetDouble(POSITION_VOLUME);

//********** ДОБАВЬТЕ СЛЕДУЮЩУЮ СТРОКУ
   ENUM_POSITION_TYPE position_type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
//****************************

   double closed=0;
   double closed_perc=0;
   double fix_closed_per=0;
//---
   for(int i=0;i<total;i++)
     {
      tp_request.comment="TP"+IntegerToString(i)+"_"+IntegerToString(position_ticket);
      if(i_TakeProfit.At(i)<tp_int && d_TakeProfit.At(i)>0)
        {
         if(closed>=100 || fix_closed_per>=100)
            break;
//---
         double lot=position_volume*MathMin(d_TakeProfit.At(i),100-closed_perc)/(100-fix_closed_per);
         lot=MathMin(position_volume-closed,lot);
         lot=c_Symbol.LotsMin()+MathMax(0,NormalizeDouble((lot-c_Symbol.LotsMin())/c_Symbol.LotsStep(),0)*c_Symbol.LotsStep());
         lot=NormalizeDouble(lot,2);
         tp_request.volume=lot;

//********** ИЗМЕНИТЕ СЛЕДУЮЩУЮ СТРОКУ
         //switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))
         switch(position_type)
//*******************************
           {
            case POSITION_TYPE_BUY:
              tp_request.type=ORDER_TYPE_SELL_LIMIT;
              tp_request.price=c_Symbol.NormalizePrice(open_price+i_TakeProfit.At(i)*c_Symbol.Point());

// (...)

Надеюсь, это имеет смысл. Еще раз спасибо за отличную работу!

 

Привет всем!

У меня проблема с [Invalid expiration], кто-нибудь знает, как это исправить?

 

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

При тестировании советника с LimitTakeProfit он выдает следующее сообщение об ошибке: "Invalid expiry".

Я пробовал добавлять срок действия вместе со структурой торгового запроса, но безрезультатно.

Кто-нибудь, пожалуйста, помогите мне.

Машинный перевод применен модератором