Вопрос к знатокам - страница 12

 
rid писал(а) >>

Я, правда, не крутой спец в этом деле.

Но есть предположение, что если после выполнения 1-го сигнала вы "повесите" флаг, то пусть он висит.

Даже если 1-й сигнал уже исчерпает себя!

Тогда второй сигнал без проблем даст сигнал на открытие.

Если я правильно п0нял вопрос...

Но ведь флаг - это переменная, как я понимаю, и с новым тиком программа увидит начальное или высчитанное по новым данным значение флага. Может я неправильно понимаю, что такое флаг?

 
MQLBankir >>:

Но ведь флаг - это переменная, как я понимаю, и с новым тиком программа увидит начальное или высчитанное по новым данным значение флага. Может я неправильно понимаю, что такое флаг?

флаг - логические константы которые имеют значение true (истина) или false (ложь), числовое представление которых 1 или 0 соответственно.

Если условие 1го сигнала(как вариант пересечение 2х машек) то флаг устанавливается в истину, если пересечения еще не произошло флаг остаеться ложным! Для вашей задачи,... примерно будет так :

bool signal1=true;

int start()

if (signal1==false) {return();}

signal1  ......... тра ля ля получение сигнала

if (signal1 ==true) //значит первый сигнал появился

  { 

    signal2 ..............тра ля ля получение сигнала  

    signal1=false;

 }

ну чет типо того должно быть )))

о пока писал уже ниже определили )

 
MQLBankir >>:

Но ведь флаг - это переменная, как я понимаю, и с новым тиком программа увидит начальное или высчитанное по новым данным значение флага. Может я неправильно понимаю, что такое флаг?

Почитайте Виды переменных там не плохо описано, от себя могу добавить что переменные обьявленные глобально сохраняют свои значения

до тех пор пока их принудительно не изменят или закроют программу.

 

Защита флагом делается так:

int flag;
int start()
{
 // функция принятия решения и установки флага
 if(flag==1)
  {flag=0;
   // код защищенный от запуска флагом   
  } 
return(0);
}
кстати
// функция принятия решения и установки флага

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

 
Urain писал(а) >>

Защита флагом делается так:

кстати

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

Спасибо всем, вроде бы разобрался))

 

Добрый вечер. Неприятнось откуда-то свалилась.

Советник с мартингейлом.

10 ступеней. На каждой ступени у позиции свой магик.

Сначала все работало нормально. Неск. дней.

Однако, вдруг всё работать перестало!

Самая первая позиция открывается - и тут же, на следующем баре закрывается!

Непонятно, почему. 


И  так бесконечно. Открывается и закрывается.

Началось только сегодня тьакое. Внезапно !

Вот блок закрытия позиций:

 //жжжжжжжжжжжж  Закрытие позиций жжжжжжжжжжжжжжжжжжжжжжж
 //(используются ф-и И.Кима
if (NumberOfPositions(NULL,OP_BUY, -1)>0) {//если есть открытые позиции
// если цена открытия первой позиции меньше текущей цены на тейкпрофит - закрываем её 
if ( (PriceOpenLastPos(NULL, OP_BUY, Magic  )+TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic  )>0)  ClosePositions(NULL, OP_BUY, Magic );

// если цена открытия второй  позиции меньше текущей цены на тейкпрофит - закрываем её 
if ( (PriceOpenLastPos(NULL, OP_BUY, Magic_2)+TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_2)>0) ClosePositions(NULL, OP_BUY, Magic_2);

 // если цена открытия след.  позиции меньше текущей цены на тейкпрофит - закрываем всё открытые позиции  
if ( (PriceOpenLastPos(NULL, OP_BUY, Magic_3)+TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_3)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);
if ( (PriceOpenLastPos(NULL, OP_BUY, Magic_4)+TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_4)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);    
if ( (PriceOpenLastPos(NULL, OP_BUY, Magic_5)+TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_5)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);   
if ( (PriceOpenLastPos(NULL, OP_BUY, Magic_6)+TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_6)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);    
if ( (PriceOpenLastPos(NULL, OP_BUY, Magic_7)+TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_7)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);   
if ( (PriceOpenLastPos(NULL, OP_BUY, Magic_8)+TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_8)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);    
if ( (PriceOpenLastPos(NULL, OP_BUY, Magic_9)+TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_9)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);
if ( (PriceOpenLastPos(NULL, OP_BUY, Magic_10)+TakeProfit_Buy*Point)<=Bid&& PriceOpenLastPos(NULL, OP_BUY, Magic_10)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);  

 } 

Может кто, - навскидку увидит неточность или ошибку ? (по ценам откр. работает советник)

 

rid писал(а) >>

Непонятно, почему.

Может кто, - навскидку увидит неточность или ошибку ?

Проблема по ходу не в этом коде, а в открытии позиций или расчете TakeProfit_Buy. Скорей всего второе.

Если в тестере воспроизводится, Print должен помочь.

 

TakeProfit_Buy я не расчитываю, - а просто задаю во внешних параметрах.

extern int       TakeProfit_Buy=21;

В тестере - такая же хрень  .Но местами.  Сначала всё норм. 

А потом эта хрень появляется. И не всегда. 

Придется видно, - коммент или принт вставлять...

Кроме того. На другом счету (инвесторском) вот сейчас, - этот же советник в этом же ДЦ на этом же инструменте и тф работает нормально!

 

ашел вроде-бы ошибку. И, конечно, совсем не там, где искал изначально. 

Помимо вышеизложенного закрытия у меня есть еще вот такое:

//----------------------- Закрытие позиций по текй профиту ----------------------------------

if (NumberOfPositions(NULL,OP_BUY, -1)>0) {// если есть открытые позиции
// если очередная  позиция закрылась по тейкпрофиту , то закрываем
// все остальные позиции  
if (isCloseLastPosByTake(NULL, OP_BUY, Magic_3 ))  {ClosePosFirstProfit(NULL, OP_BUY, -1);}
if (isCloseLastPosByTake(NULL, OP_BUY, Magic_4 ))  {ClosePosFirstProfit(NULL, OP_BUY, -1);}    
if (isCloseLastPosByTake(NULL, OP_BUY, Magic_5 ))  {ClosePosFirstProfit(NULL, OP_BUY, -1);}   
if (isCloseLastPosByTake(NULL, OP_BUY, Magic_6 ))  {ClosePosFirstProfit(NULL, OP_BUY, -1);}    
if (isCloseLastPosByTake(NULL, OP_BUY, Magic_7 ))  {ClosePosFirstProfit(NULL, OP_BUY, -1);}   
if (isCloseLastPosByTake(NULL, OP_BUY, Magic_8 ))  {ClosePosFirstProfit(NULL, OP_BUY, -1);}    
if (isCloseLastPosByTake(NULL, OP_BUY, Magic_9 ))  {ClosePosFirstProfit(NULL, OP_BUY, -1);}
if (isCloseLastPosByTake(NULL, OP_BUY, Magic_10))  {ClosePosFirstProfit(NULL, OP_BUY, -1);} 
                                           }

Получается, что флаг функции 
isCloseLastPosByTake( )//если поза закрылась по тейку - возвращает единицу
после её исполнения равен = 1, но после закрытия всех других позиций он так и остается равен единице !И конечно, при открытии следующей первой позиции с  магиком = магик_1 - она сразу же закрывается !

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

//--------------------------------------------------------------

И ещё. Подскажите, - Как же мне сделать, чтобы этот блок всё-таки работал корректно ? 

Иначе говоря, как обнулить функцию isCloseLastPosByTake() после закрытия всех позиций?

 
rid >>:

Иначе говоря, как обнулить функцию isCloseLastPosByTake() после закрытия всех позиций?

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

Причина обращения: