Закрытие лока на откате

intercool

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

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

т.е. первое попадание цены в ноль пропустить а на откате попадание в ноль уже закрыть , итд.
 

AlexeyVik

Программист mql4 mql5
Вариантов на самом деле несколько. Перечислю пару самых простых.
1. Поставить флаг. Если выполнилось условие для закрытия в первый раз флаг переключается. И потом при этом состоянии флага при следующем условии закрытия ордер закрывается и флаг возвращается в исходное положение.
2. Тот-же флаг, но переключение его происходит только при прохождении в профит на определённое количество пунктов.
 

AlexeyVik

Программист mql4 mql5
Но отвечу я здесь.
Если ты учишься программированию, то надо понять написанное и постараться это написать самому. А когда сделаешь тогда и поправим. если где-то будет надо. А вот учить/подсказывать кусками кода не в моих правилах. Дело ещё в том, что это надо расписывать не подряд, а согласно всему алгоритму твоего советника.
Второй вариант, если ты хочешь просто писать из кусочков чужого кода, то это тоже не ко мне. Не обессудь.
 

intercool

Интересующийся
Вот этот модуль , как понял дописал код с флагами, - пока на откате не работает

// если есть ордер хеджирующий - смотрим закрытие его в ноль

bool fl_Buy = false; //флаг для бай
bool fl_Sell = false; //флаг для селл

if(IsHedging==1) //если есть локирующий ордер
{


if(OrderType()==0 && OrderOpenPrice()==Bid && fl_Buy == true) // если цена ордера равна 0 и флаг бай значение 1
{
Print("Второй проход - Закрытие хеджирующего ордера Бай в ноль");
OrderClose(OrderTicket(),OrderLots(),Bid,3,clrNONE);
HedgedTick[MassPos]=0;
HedgingTick[MassPos]=0;
fl_Buy = false; // возращаем флаг в исходное состояние
}
if(OrderType()==0 && OrderOpenPrice()==Bid && fl_Buy == false) {fl_Buy = true ; Print("первый проход, меняем значение флага Бай, теперь значение ==",fl_Buy);}


if(OrderType()==1 && Ask==OrderOpenPrice()&& fl_Sell == true)// если цена ордера равна 0 и флаг селл значение 1
{
Print("Второй проход - Закрытие хеджирующего ордера в ноль");
OrderClose(OrderTicket(),OrderLots(),Ask,3,clrNONE);
HedgedTick[MassPos]=0;
HedgingTick[MassPos]=0;
fl_Sell = false; // возращаем флаг в исходное состояние
}
if(OrderType()==1 && Ask==OrderOpenPrice()&& fl_Sell == false) {fl_Sell = true ; Print("первый проход, меняем значение флага Селл, теперь значение ==",fl_Sell);}

}
 
Последнее редактирование:

intercool

Интересующийся
пока не могу понять как написать условие, для возвращающих в исходное состояние флаги fl_Sell = false; и fl_Buy = false; , иначе код по флагам безсмысленный.
 
Последнее редактирование:

intercool

Интересующийся
Вариантов на самом деле несколько.
2. Тот-же флаг, но переключение его происходит только при прохождении в профит на определённое количество пунктов.

Вот по второму принципу вроде заработало:

// Объявление вынес в глобальные переменные
bool fl_Buy = false; //флаг для бай
bool fl_Sell = false; //флаг для селл
//------------------------------------------------

if(IsHedging==1) //если есть локирующий ордер
{


if(OrderType()==0 && OrderOpenPrice()==Bid && fl_Buy == true) // если цена ордера равна 0 и флаг бай значение 1
{
Print("Второй проход - Закрытие хеджирующего ордера Бай в ноль");
OrderClose(OrderTicket(),OrderLots(),Bid,3,clrNONE);
HedgedTick[MassPos]=0;
HedgingTick[MassPos]=0;
fl_Buy = false; // возращаем флаг в исходное состояние
}
if(OrderType()==0 && OrderOpenPrice()==Bid+3*Point && fl_Buy == false) {fl_Buy = true ; Print("первый проход, меняем значение флага Бай, теперь значение ==",fl_Buy);}


if(OrderType()==1 && Ask == OrderOpenPrice()&& fl_Sell == true)// если цена ордера равна 0 и флаг селл значение 1
{
Print("Второй проход - Закрытие хеджирующего ордера в ноль");
OrderClose(OrderTicket(),OrderLots(),Ask,3,clrNONE);
HedgedTick[MassPos]=0;
HedgingTick[MassPos]=0;
fl_Sell = false; // возращаем флаг в исходное состояние
}
if(OrderType()==1 && Ask-3*Point == OrderOpenPrice()&& fl_Sell == false) {fl_Sell = true ; Print("первый проход, меняем значение флага Селл, теперь значение ==",fl_Sell);}

}

Теперь как только профит (хеджа) преодалеет 3 пунка, флаг переворачивается и скрипт ждет возвращения тренда.
Но я не уверен на 100% в корректности этого кода.
 

AlexeyVik

Программист mql4 mql5
Ну вот и всё получилось. Если это четырёхзнак, то 3 пункта наверное достаточно, а для пятизнака я думаю маловато.
Ну а если гложут какие-то сомнения, тестер в руки и при визуализации проверяем что имеем.
И ещё одно замечание:
OrderOpenPrice()==Bid бывает так редко что можно попасть в неприятность. Надо это учитывать и писать OrderOpenPrice() >= Bid или OrderOpenPrice() <= Bid в зависимости от ситуации. И соответственно Bid или Ask
 

intercool

Интересующийся
если в OrderOpenPrice()==Bid установить не равно , закрытие в ноль не получается
 

AlexeyVik

Программист mql4 mql5
А скачок цены через цену открытия случается достаточно часто и следовательно ордер не будет закрыт даже в большом минусе.
Ну в общем, со временем ты к этому придёшь сам.
 
Верх