Гарэгин Диноян
Интересующийся
Собственно тема.. Хочу что б после стоп лосса мой робот открывал противоположную позицию... Помогите с кодом.
Собственно тема.. Хочу что б после стоп лосса мой робот открывал противоположную позицию... Помогите с кодом.
Тоже вариант, но в исходном варианте речь идет уже о роботе, который, вероятно, и открывает указанную сделку. Однако, лимит-ордер может этот же робот и выставлять.Можно поставить отложенный ордер BUY_LIMIT или SELL_LIMIT по цене StopLoss и советник не нужен
Здравствуйте.Собственно тема.. Хочу что б после стоп лосса мой робот открывал противоположную позицию... Помогите с кодом.
//+------------------------------------------------------------------+
//| Martingale - classic.mq4 |
//| Copyright © 2013, MoneyInNetwork.ru |
//| http://moneyinnetwork.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, MoneyInNetwork.ru"
#property link "http://moneyinnetwork.ru"
extern string s1 = "Объем для первой сделки серии, лот";
extern double Lot = 0.01;
extern string s2 = "Уровень стоп-лосса, пунктов";
extern double stoploss = 21;
extern string s3 = "Уровень тейк-профита, пунктов";
extern double takeprofit = 84;
extern string s4 = "Уникальная метка для ордеров, открываемых только этим советником";
extern double MagicNumber = 600;
extern string s5 = "Максимальное отклонение от запрошенной цены, пунктов";
extern double slip = 3;
int init()
{
return(0);
}
int deinit()
{
return(0);
}
int start()
{
//инициализация параметров
bool flag = false;
int ticket = 0;
double lots = Lot;
int old_order_type = -1;
//ищем среди всех открытых ордеров открытый советником ордер
RefreshRates();
for ( int trade = OrdersTotal() - 1; trade >= 0; trade-- )
{
//проверяем есть ли среди всех открытых ордеров именно тот ордер, который открыт данным советником.
//ВНИМАНИЕ! MagicNumber - должен быть свой для каждого советника!
if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
flag = true; //значение флага наличия ордера - ордер открыт
break; //закончим поиск
}
}
//ордер советником открыт - выходим без действий, ожидая его закрытия по тейк профиту или стоп лоссу.
if ( flag )
{
return (0);
}
//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер
flag = false;
for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- )
{
if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
if ( OrderProfit()>=0 ) lots = Lot; //последний закрытый советником ордер был прибыльным или безубыточным, значит, следующий ордер открываем с начальным объемом
else lots = 2*OrderLots(); //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем удвоенным объемом
old_order_type = OrderType(); //запоминаем тип ордера - прокупка или продажа.
flag = true;
break; //прекращаем поиск
}
}
if ( !flag )
old_order_type = OP_BUY; //в истории нет ордеров открытых этим советников, значит, стартуем с покупок
//если раньше покупали, то теперь продаем
if ( old_order_type == OP_BUY )
{
ticket = OrderSend(Symbol(), OP_SELL, NormalizeDouble(lots,2), NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
Sleep (1000); //задержка в одну секунду для обрабатки запроса торговым сервером брокера
return (0);
}
//если раньше продавали, то теперь покупаем
if ( old_order_type == OP_SELL )
{
ticket = OrderSend(Symbol(), OP_BUY, NormalizeDouble(lots,2), NormalizeDouble(Ask, Digits), slip, NormalizeDouble(Bid-stoploss*Point, Digits), NormalizeDouble(Bid+takeprofit*Point, Digits), "Martingale-Buy", MagicNumber, 0, Green);
Sleep (1000); //задержка в одну секунду для обрабатки запроса торговым сервером брокера
return (0);
}
return (0);
extern int Risk=1; //риск на сделку, %
Lot = NormalizeDouble (Risk*AccountEquity()/100000, 2); //расчет по средствам
if ( Lot<0.01 ) Lot = 0.01;
Данная запись некорректна. Представьте, что на счете работают сразу несколько советников или дополнительно "приторговываете ручками".if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
flag = false;
for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- )
{
if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
if ( OrderProfit()>=0 ) lots = Lot; //последний закрытый советником ордер был прибыльным или безубыточным, значит, следующий ордер открываем с начальным объемом
else lots = 2*OrderLots(); //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем удвоенным объемом
old_order_type = OrderType(); //запоминаем тип ордера - прокупка или продажа.
flag = true;
break; //прекращаем поиск
}
}
Данный код также неправильный. Уровни стоп лосс и тейк профит в Вашем случае при расчетах необходимо округлять на количество цифр после десятичной точки в цене текущего инструмента. Следующая ошибка: ордера открываются на покупку по цене Ask, а на продажу по цене Bid. Соответственно, уровень стоп лосс и тейк профит для первого случая рассчитываются от цены Bid, а для второго от цены Ask:OrderSend(Symbol(), OP_BUY, lots, Ask, 100, Ask-stoploss*Point, Ask+takeprofit*Point);
для продажOrderSend(Symbol(), OP_BUY, lots, Ask, 100, NormalizeDouble(Bid-stoploss*Point, Digits), NormalizeDouble(Bid+takeprofit*Point, Digits));
Ну, и проскальзывание в 100 пипсов - это, по-моему, чрезмерно (да еще при таких параметрах stoploss=100 takeprofit=500). Вы на новостях что ли торговать собрались с таким проскальзыванием (допустимое отклонение от запрошенной цены)?OrderSend(Symbol(), OP_SELL, lots, Bid, 100, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits));
//+------------------------------------------------------------------+
//| Для Гарэгин Диноян(mmgp).mq4 |
//| Copyright © 2013, MoneyInNetwork.ru |
//| http://moneyinnetwork.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, MoneyInNetwork.ru"
#property link "http://moneyinnetwork.ru"
extern string s1 = "Объем для первой сделки серии, лот";
extern double Lot = 0.01;
extern string s2 = "Уровень стоп-лосса, пипсов";
extern double stoploss = 100;
extern string s3 = "Уровень тейк-профита, пипсов";
extern double takeprofit = 500;
extern string s4 = "Уникальная метка для ордеров, открываемых только этим советником";
extern double MagicNumber = 600;
extern string s5 = "Максимальное отклонение от запрошенной цены, пипсов";
extern double slip = 15;
int init()
{
return(0);
}
int deinit()
{
return(0);
}
int start()
{
//инициализация параметров
int ticket = 0;
int old_order_type = OP_SELL;
//ищем среди всех открытых ордеров открытый советником ордер
RefreshRates();
for ( int trade = OrdersTotal() - 1; trade >= 0; trade-- )
{
//проверяем есть ли среди всех открытых ордеров именно тот ордер, который открыт данным советником.
if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
//если есть незакрытый ордер - выходим
return (0);
}
}
//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер
for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- )
{
if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
old_order_type = OrderType();
if ( OrderProfit()<0 ) //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем в направлении, противоположном закрытому с убытком
{
break; //прекращаем поиск
}
}
}
//если раньше покупали, то теперь продаем
if ( old_order_type == OP_BUY )
{
ticket = OrderSend(Symbol(), OP_SELL, Lot, NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
return (0);
}
//если раньше продавали, то теперь покупаем
if ( old_order_type == OP_SELL )
{
ticket = OrderSend(Symbol(), OP_BUY, Lot, NormalizeDouble(Ask, Digits), slip, NormalizeDouble(Bid-stoploss*Point, Digits), NormalizeDouble(Bid+takeprofit*Point, Digits), "Martingale-Buy", MagicNumber, 0, Green);
Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
return (0);
}
}
А в чем радость-то? Это ж потенциальный сливатор. Или вход у Вас идет по какой-либо системе?Благодарю!!! Пашет!!! Он даже на ECN счетах пашет...
Добрый вечер, подскажите пожалуйста, как проделать примерно тоже самое, но с добавлением индикатора, а то не могу разобрать, вставляю индикатор и тогда советник работает не так как хотел...и есть еще одна проблема в выложенном здесь советнике, он с каждым стоплоссом увеличивает лот, и потом его не понижает, а только удваивает, пока полностью не сольет средства, заранее спасибо!
добавлено через 5 минут
Вот наброски ))):
extern double Lots = 0.1;
extern int Magic = 345;
extern int Slippage = 5;
extern int StopLoss = 40;
extern int TakeProfit = 20;
extern int MaPeriod = 20; // Переменные Период усреднения для вычисления индикатора
extern int MaShift = 1; // Переменные Сдвиг индикатора относительно ценового графика.
bool flag = false;
int old_order_type = -1;
double maprice, SL, TP;
int tameprev;
int init()
{
if(Digits == 3 || Digits == 5)
{
StopLoss *= 10;
Slippage *= 10;
TakeProfit *= 10;
}
return(0);
}
int deinit()
{
return(0);
}
int start()
{
if(tameprev == Time[0]) return(0);
tameprev = Time[0];
maprice = iMA(Symbol(), 0, MaPeriod, MaShift, MODE_SMMA, PRICE_CLOSE, 1);
SL = NormalizeDouble(Bid - StopLoss*Point, Digits);
TP = NormalizeDouble(Bid + TakeProfit*Point, Digits);
if(CountBuy() + CountSell() == 0 && Ask > maprice)
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, "Покупка", Magic, 0, Red);
SL = NormalizeDouble(Ask + StopLoss*Point, Digits);
TP = NormalizeDouble(Ask - TakeProfit*Point, Digits);
if(CountBuy() + CountSell() == 0 && Bid < maprice)
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, SL, TP, "Продажа", Magic, 0, Blue);
return (0);
}
//+------------------------------------------------------------------+
int CountBuy()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
count++;
}
}
return(count);
}