SGarnov: Попробовал вставить, что то не компилируется. Весь код выставляю, если есть необходимость, выставлю скрин компиляции. Думаю ещё вот может быть в чём проблема, у меня тейк выставляет по соотношению к стопу через коэффициент (внешняя переменная), может его переделать на ручную установку и советнику проще будет прибавлять?
из глобальной области убери. magic=0 прилепил для компиляции.
Убрал, ошибок нет по компиляции, только 1 warnings выскакивает в третьей строке функции в столбце tp=0 со слыкой на внешнюю переменную int tp=0. Что ему не нравится не совсем до конца понимаю. Весь код прилагаю, если не сложно поправьте, истина где то рядом.
Убрал, ошибок нет по компиляции, только 1 warnings выскакивает в третьей строке функции в столбце tp=0 со слыкой на внешнюю переменную int tp=0. Что ему не нравится не совсем до конца понимаю. Весь код прилагаю, если не сложно поправьте, истина где то рядом.
Вот примерно так
//+------------------------------------------------------------------+//| SGarnov.v2.mq4 |//| Copyright 2020, DrMak. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, DrMak."#property link"https://www.mql5.com"#property version"1.00"#property strict//--- input parametersinputint T_Profit = 2; // Коэффициент Take Profitinputint S_Loss = 100; // Уровень Stop Lossinputdouble O_Lots = 0.01; //Лотыinputint Input4;
inputint Input5;
inputint Input6;
double sl_price,tp_price,t_profit,s_loss;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
t_profit = S_Loss*T_Profit;
s_loss = MathMax(S_Loss, MarketInfo(Symbol(), MODE_STOPLEVEL));
// Проверяем наличие ордеров BUYif(CountOrders(_Symbol, 0)>0)
{
// Проверяем последний закрытый ордер SELL на наличие убытка в пунктахif(GetPointLastLoss(1)>0)
{
// Если убыток есть, то добавляем пункты убытка
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(GetPointLastLoss(1)+Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
else
{
// Если убытка нет
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
}
// Проверяем наличие ордеров SELLif(CountOrders(_Symbol, 1)>0)
{
// Проверяем последний закрытый ордер BUY на наличие убытка в пунктахif(GetPointLastLoss(0)>0)
{
// Если убыток есть, то добавляем пункты убытка
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(GetPointLastLoss(0)+Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
else
{
// Если убытка нет
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
}
}
//+--------------------------------------------------------------------------------------------------------------------+//| Подсчет ордеров по типу |//+--------------------------------------------------------------------------------------------------------------------+//| 0 - ордера типа BUY 1 - ордера типа SELL |//| 2 - ордера типа BUYLIMIT 3 - ордера типа SELLLIMIT |//| 4 - ордера типа BUYSTOP 5 - ордера типа SELLSTOP |//| 6 - ордера типа Balance -1 - Все типы ордеров |//+--------------------------------------------------------------------------------------------------------------------+int CountOrders(string symb="", int or_ty=-1)
{
int cnt=0;
if(symb=="0") symb=_Symbol;
for(int pos=OrdersTotal()-1;pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS)==true)
{
if(OrderSymbol()==symb || symb=="")
{
if(or_ty<0 || or_ty==OrderType()) cnt++;
}
}
}
return(cnt);
}
//+----------------------------------------------------------------------------+//| Модификация ордера |//+----------------------------------------------------------------------------+//| sl - ценовой уровень стопа |//| tp - ценовой уровень тейка |//+----------------------------------------------------------------------------+void ModifyOrder(string symb="", double sl=0, double tp=0)
{
if(symb=="0") symb=_Symbol;
for(int pos=OrdersTotal()-1;pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS)==true)
{
if(OrderSymbol()==symb || symb=="")
{
if(OrderStopLoss()==0)
{
if(OrderType()==OP_BUY)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-sl_price, OrderOpenPrice()+tp_price, OrderExpiration()))
{Print("Ордер модифицирован");}
else
{Print("Ошибка модификации ордера:", GetLastError());}
}
if(OrderType()==OP_SELL)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+sl_price, OrderOpenPrice()-tp_price, OrderExpiration()))
{Print("Ордер модифицирован");}
else
{Print("Ошибка модификации ордера:", GetLastError());}
}
}
}
}
}
}
//+----------------------------------------------------------------------------+//| Возвращает пункты убытка последнего закрытого ордера в пунктах |//| 0 - последний ордер BUY |//| 1 - последний ордер SELL |//+----------------------------------------------------------------------------+double GetPointLastLoss( int or_ty=-1)
{
datetime t=0;
double result=0,p=0;
int i=OrdersHistoryTotal();
for(int pos=0; pos<i; pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
{
if((OrderSymbol()==_Symbol))
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(t<OrderCloseTime())
{t=OrderCloseTime(); p=OrderProfit(); or_ty=OrderType();
if(or_ty==OP_BUY&&p<0)
{
result=OrderOpenPrice()-OrderClosePrice();
} else {result=0;}
if(or_ty==OP_SELL&&p<0)
{
result=OrderClosePrice()-OrderOpenPrice();
} else {result=0;}
}
}
}
}
}
return(result);
}
//+------------------------------------------------------------------+
А) Если цена достигает тейка - советник убирает стоп лосс и отложенник на продажу;
Вариант 2.
Б) Если сработал стоп лосс и "отправился в историю сделок" то:
Открылся ордер на продажу и советник повторно к этому ордеру выставил:
стоп лосс (внешний параметр задаётся в настройках);
тейк профит + сработанный стоп лосс из истории;
отложенный ордер на покупку на уровне стоп лосс.
Цена достигла тейка - советник убирает стоп лосс и отложенник на покупку.
И наоборот если начинается работа с отложенника на продажу.
И так советник работает до тех пор пока не остановит свою работу по внешнему параметру "Количество Stop Loss" ( в моём случае стоит 2 - это означает что вариант 2 повторится 3 раза и советник в дальнейшем перестанет работать и уберёт все отложенные ордера в учёт первый стоп не идёт).
К тейку прибавляется один стоп во втором варианте. если тейк не достигается и 2 вариант повторяется то к тейку прибавляется 2 стопа и так далее, зависит от заданного внешнего параметра "Количество Stop Loss".
Код который выставил я работает как надо, за исключением проблемы которую я описывал (не видит в истории 1 стоп или 2 стопа которые должен прибавить к тейку).
А) Если цена достигает тейка - советник убирает стоп лосс и отложенник на продажу;
Вариант 2.
Б) Если сработал стоп лосс и "отправился в историю сделок" то:
Открылся ордер на продажу и советник повторно к этому ордеру выставил:
стоп лосс (внешний параметр задаётся в настройках);
тейк профит + сработанный стоп лосс из истории;
отложенный ордер на покупку на уровне стоп лосс.
Цена достигла тейка - советник убирает стоп лосс и отложенник на покупку.
И наоборот если начинается работа с отложенника на продажу.
И так советник работает до тех пор пока не остановит свою работу по внешнему параметру "Количество Stop Loss" ( в моём случае стоит 2 - это означает что вариант 2 повторится 3 раза и советник в дальнейшем перестанет работать и уберёт все отложенные ордера в учёт первый стоп не идёт).
К тейку прибавляется один стоп во втором варианте. если тейк не достигается и 2 вариант повторяется то к тейку прибавляется 2 стопа и так далее, зависит от заданного внешнего параметра "Количество Stop Loss".
Код который выставил я работает как надо, за исключением проблемы которую я описывал (не видит в истории 1 стоп или 2 стопа которые должен прибавить к тейку).
Как то так.
"Количество Stop Loss" - подряд или за текущий день?
"Количество Stop Loss" - подряд или за текущий день?
Количество стопов подряд по валютной паре.
Советник стоит на нескольких валютных парах и в историю попадает несколько стопов и в разной последовательности, чтобы в истории разбираться советник изначально ордера метит ID но в истории их не находит,я думал что ОrderMagikNumber() будет их искать. Может из за того что в истории стопы с разных валютных пар советник перестает "видеть" их?я на одной паре не пробовал работать советником, да и толк от этого никакой тогда будет.
ещё раз исходник выставить? Ему только и нужно что поправить "поиск стоповых сделок из истории и заставить его прибавить к вновь выставляемому тейку".
У тебя советник сопровождает ордера выставленные вручную?
Попробовал вставить, что то не компилируется. Весь код выставляю, если есть необходимость, выставлю скрин компиляции. Думаю ещё вот может быть в чём проблема, у меня тейк выставляет по соотношению к стопу через коэффициент (внешняя переменная), может его переделать на ручную установку и советнику проще будет прибавлять?
Функцию
из глобальной области убери. magic=0 прилепил для компиляции.
magic=0Функцию
из глобальной области убери. magic=0 прилепил для компиляции.
Убрал, ошибок нет по компиляции, только 1 warnings выскакивает в третьей строке функции в столбце tp=0 со слыкой на внешнюю переменную int tp=0. Что ему не нравится не совсем до конца понимаю. Весь код прилагаю, если не сложно поправьте, истина где то рядом.
Убрал, ошибок нет по компиляции, только 1 warnings выскакивает в третьей строке функции в столбце tp=0 со слыкой на внешнюю переменную int tp=0. Что ему не нравится не совсем до конца понимаю. Весь код прилагаю, если не сложно поправьте, истина где то рядом.
Вот примерно так
В твоем случае magic вообще не нужен
Вот примерно так
В твоем случае magic вообще не нуженСпасибо, буду тестировать, отпишусь. Надеюсь он так же работает как и мой, но прибавляет стоп (если он сработал) к новому тейку.
А для чего необходимы внешние параметры Input4; 5; 6?
Спасибо, буду тестировать, отпишусь. Надеюсь он так же работает как и мой, но прибавляет стоп (если он сработал) к новому тейку.
Здесь только модификация. Нет удаления ордеров или разворота.
Если опишешь что советник должен делать, я постараюсь помочь.
А для чего необходимы внешние параметры Input4; 5; 6?
Если опишешь что советник должен делать, я постараюсь помочь.
Выставляю отложенник на покупку - советник в работе - срабатывает отложенник - советник это "видит" и выставляет к этому открытому ордеру:
стоп лосс (внешний параметр задаётся в настройках);
тейк прифит (внешний параметр задаётся в настройках через коэффициент к примеру 1 к 2);
отложенный ордер на продажу на уровне стоп лосс.
Возможные варианты развития событий.
Вариант 1.
А) Если цена достигает тейка - советник убирает стоп лосс и отложенник на продажу;
Вариант 2.
Б) Если сработал стоп лосс и "отправился в историю сделок" то:
Открылся ордер на продажу и советник повторно к этому ордеру выставил:
стоп лосс (внешний параметр задаётся в настройках);
тейк профит + сработанный стоп лосс из истории;
отложенный ордер на покупку на уровне стоп лосс.
Цена достигла тейка - советник убирает стоп лосс и отложенник на покупку.
И наоборот если начинается работа с отложенника на продажу.
И так советник работает до тех пор пока не остановит свою работу по внешнему параметру "Количество Stop Loss" ( в моём случае стоит 2 - это означает что вариант 2 повторится 3 раза и советник в дальнейшем перестанет работать и уберёт все отложенные ордера в учёт первый стоп не идёт).
К тейку прибавляется один стоп во втором варианте. если тейк не достигается и 2 вариант повторяется то к тейку прибавляется 2 стопа и так далее, зависит от заданного внешнего параметра "Количество Stop Loss".
Код который выставил я работает как надо, за исключением проблемы которую я описывал (не видит в истории 1 стоп или 2 стопа которые должен прибавить к тейку).
Как то так.
Выставляю отложенник на покупку - советник в работе - срабатывает отложенник - советник это "видит" и выставляет к этому открытому ордеру:
стоп лосс (внешний параметр задаётся в настройках);
тейк прифит (внешний параметр задаётся в настройках через коэффициент к примеру 1 к 2);
отложенный ордер на продажу на уровне стоп лосс.
Возможные варианты развития событий.
Вариант 1.
А) Если цена достигает тейка - советник убирает стоп лосс и отложенник на продажу;
Вариант 2.
Б) Если сработал стоп лосс и "отправился в историю сделок" то:
Открылся ордер на продажу и советник повторно к этому ордеру выставил:
стоп лосс (внешний параметр задаётся в настройках);
тейк профит + сработанный стоп лосс из истории;
отложенный ордер на покупку на уровне стоп лосс.
Цена достигла тейка - советник убирает стоп лосс и отложенник на покупку.
И наоборот если начинается работа с отложенника на продажу.
И так советник работает до тех пор пока не остановит свою работу по внешнему параметру "Количество Stop Loss" ( в моём случае стоит 2 - это означает что вариант 2 повторится 3 раза и советник в дальнейшем перестанет работать и уберёт все отложенные ордера в учёт первый стоп не идёт).
К тейку прибавляется один стоп во втором варианте. если тейк не достигается и 2 вариант повторяется то к тейку прибавляется 2 стопа и так далее, зависит от заданного внешнего параметра "Количество Stop Loss".
Код который выставил я работает как надо, за исключением проблемы которую я описывал (не видит в истории 1 стоп или 2 стопа которые должен прибавить к тейку).
Как то так.
"Количество Stop Loss" - подряд или за текущий день?
"Количество Stop Loss" - подряд или за текущий день?
Количество стопов подряд по валютной паре.
Советник стоит на нескольких валютных парах и в историю попадает несколько стопов и в разной последовательности, чтобы в истории разбираться советник изначально ордера метит ID но в истории их не находит,я думал что ОrderMagikNumber() будет их искать. Может из за того что в истории стопы с разных валютных пар советник перестает "видеть" их?я на одной паре не пробовал работать советником, да и толк от этого никакой тогда будет.
ещё раз исходник выставить? Ему только и нужно что поправить "поиск стоповых сделок из истории и заставить его прибавить к вновь выставляемому тейку".