- Кто такой "IsSetBuy" и что он делает с переданным magic?
- Почему нет распечатки сразу при входе в функцию значения переданного magic?
- Почему нет распечатки после строки " if(m_position.PositionType()==POSITION_TYPE_SELL && m_position.Magic()==magic)" значения m_position.Magic() и magic?
Кто такой "IsSetBuy" и что он делает с переданным magic?
Функция проверки дистанции от последней позиции с нужным мне магиком...
По логике вещей до этой функции дойти дело не должно, так как магик позиции не равен магику, переданного в функцию.
Я за эту проверку говорю, где идет сравнение магиков. В это условие вообще зайти не должно, если они не равны, а заходит:
if(m_position.PositionType()==POSITION_TYPE_BUY && m_position.Magic()==magic)Как раз по вашему третьему вопросу распечатка есть. Там явно указано, где магик, переданный в функцию, а где магик позиции...
Функция проверки дистанции от последней позиции с нужным мне магиком...
По логике вещей до этой функции дойти дело не должно, так как магик позиции не равен магику, переданного в функцию.
Я за эту проверку говорю, где идет сравнение магиков. В это условие вообще зайти не должно, если они не равны, а заходит:
Выполните все три пункта - и нет так как это думаете Вы, а именно так как написал я.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Условие равенства верно при неравных значениях. Почему?
Vladimir Karputov, 2020.05.14 13:02
- Кто такой "IsSetBuy" и что он делает с переданным magic?
- Почему нет распечатки сразу при входе в функцию значения переданного magic?
- Почему нет распечатки после строки " if(m_position.PositionType()==POSITION_TYPE_SELL && m_position.Magic()==magic)" значения m_position.Magic() и magic?
Примерно так:
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OpenNextBuyPositionBySignal(CTrade &m_trade,long magic,double ExtDP,double iuv,double imv,int itp,int isl,double etp,double esl,double ev,double &rev,string numstr,ulong &last_pt) { for(int i=PositionsTotal()-1; i>=0; i--) if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties if(m_position.Symbol()==m_symbol.Name()) { Print("#_2214! magic: ",magic); if(m_position.PositionType()==POSITION_TYPE_SELL && m_position.Magic()==magic) { Print("#_2214! magic: ",magic); Print("#_2218! m_position.Magic(): ",m_position.Magic()); if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0) { if(IsSetBuy(magic,ExtDP)==true)
Советую не опираться на Position совсем.
Примерно так:
Откровенно говоря, я немного в недоумении. При входе в функцию магик нужный мне. При входе в условие проверки магик, переданный в функцию, и магик
позиции одинаковые. То есть все хорошо. Но уже после проверки дистанции магик позиции невероятным образом оказывается другим. Как? Ниже
код функции, чтобы было видно, что здесь только возврат и нет никакой замены. И скрин журнала, информация после выделенной
строки.
bool IsSetBuy(long magic,double dist) { //--- the "total-1" element is the last open position bool isbuy=true; int total=PositionsTotal(); for(int i=total-1;i>=0;i--) { if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==magic) { if(m_position.PositionType()==POSITION_TYPE_BUY) { if((m_position.PriceOpen()-m_position.PriceCurrent())<dist) { isbuy=false; return isbuy; } if((m_position.PriceOpen()-m_position.PriceCurrent())>dist) { isbuy=true; } } } } //--- return isbuy; }
Советую не опираться на Position совсем.
Откровенно говоря, я немного в недоумении. При входе в функцию магик нужный мне. При входе в условие проверки магик, переданный в функцию, и
магик позиции одинаковые. То есть все хорошо. Но уже после проверки дистанции
магик позиции невероятным образом оказывается другим. Как? Ниже код функции, чтобы было видно, что здесь только возврат и нет
никакой замены. И скрин журнала, информация после выделенной строки.
1. Вставляйте код и лог-файл правильно (картинкой вставлять не нужно)
2. Вы сами уже ответили на свой вопрос (кстати я сразу Вам об этом намекал )
Вывод: смотрите, что и зачем Вы делаете в своей функции и зачем меняете magic.- www.mql5.com
Также нужно всё-таки определиться: ищите Вы SELL позицию или всё таки BUY?
void OpenNextBuyPositionBySignal(CTrade &m_trade,long magic,double ExtDP,double iuv,double imv,int itp,int isl,double etp,double esl,double ev,double &rev,string numstr,ulong &last_pt) { for(int i=PositionsTotal()-1; i>=0; i--) if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties if(m_position.Symbol()==m_symbol.Name()) { Print("#2214! magic: ",magic); if(m_position.PositionType()==POSITION_TYPE_SELL && m_position.Magic()==magic) { Print("#2214! magic: ",magic); Print("#2218! m_position.Magic(): ",m_position.Magic()); if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0) { if(IsSetBuy(magic,ExtDP)==true) {
Функция называется 'OpenNextBuyPositionBySignal', затем сначала ищите позицию 'POSITION_TYPE_SELL' и вдруг сразу в 'IsSetBuy' Вы ищите позицию BUY.
bool IsSetBuy(long magic,double dist) { //--- the "total-1" element is the last open position bool isbuy=true; int total=PositionsTotal(); for(int i=total-1;i>=0;i--) { if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==magic) { if(m_position.PositionType()==POSITION_TYPE_BUY) { if((m_position.PriceOpen()-m_position.PriceCurrent())<dist) { isbuy=false; return isbuy; } if((m_position.PriceOpen()-m_position.PriceCurrent())>dist) { isbuy=true; } } } } //--- return isbuy; }
То есть что Вы делаете: Ваша ошибка в том, что Вы ПЕРЕЗАПИСЫВАЕТЕ переменную m_position!!!
Исправьте логику программы.
- www.mql5.com
Также нужно всё-таки определиться: ищите Вы SELL позицию или всё таки BUY?
Функция называется 'OpenNextBuyPositionBySignal', затем сначала ищите позицию 'POSITION_TYPE_SELL' и вдруг сразу в 'IsSetBuy' Вы ищите позицию BUY.
Я на свой вопрос не ответил к сожалению...
Здесь всё верно. Магик не меняется в функции.И еще момент, магики у меня не позиции Buy и Sell разделяют, а стратегии...
Если обратиться к моему первоначальному посту, то там я указал две функции:
1. 'OpenNextBuyPositionBySignal' - открытие позиций Buy по сигналу и соответственно в ней будет проверка 'IsSetBuy'. Позиция Buy может открыться как после Buy, так и после Sell.
2. 'OpenNextSellPositionBySignal' - открытие позиций Sell по сигналу и соответственно в ней будет проверка 'IsSetSell'. Позиция Sell может открыться как после Sell, так и после Buy.
Каким образом я её ПЕРЕЗАПИСЫВАЮ? Я что-то вашу логику не улавливаю? Объясните? Я всего лишь в цикле к ней обращаюсь и получаю информацию.
Основная проверка идет на соответствие магика, то есть позиции с другим магиком в переборе участвовать не должны. Так? Или я уже ничего не
понимаю после вашего вывода.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
shev1404, 2020.05.13 12:16
Добрый день.
Наткнулся на непонятную вещь и не пойму в чем дело.
Есть две функции, которые используются в разных стратегиях. По логике вещей код в проверках типа
выполняться не должен, если одно из условий не верно. Но он почему-то выполняется, если магик номер позиции и переданный в функцию магик НЕ РАВНЫ.
Вроде сравнение целочисленных типов происходит. Почему, не могу понять. Ниже на скриншоте журнала это видно.