у меня так:
input int StartHour = 4; // Время начала работы
input int EndHour = 22; // Время окончания работы (открытия ордеров)
...
bool workTime = StartHour = StartHour && Hour() Hour() >= StartHour || Hour() if (workTime) Торгуем...
Доработка советников: общая тема📌
От Garfik, 4 августа, 2011 в Уголок Программиста
Написал обычный сеточный советник с мартином, хочу его подредактировать, но не как не могу написать функцию которая возвращала бы ЛОТ ПРЕДПОСЛЕДНЕГО открытого ордера. Мне надо сравнить лот последнего ордера с предпоследним. Функция для поиска последнего ордера есть, как её переделать, чтоб ещё предпоследний был. :-?
double FindLastLots (int otype)
{
double oldlots = 0;
int oldticket;
ticket = 0;
for (int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES ))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype )
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldlots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldlots);
}
Делается это за один проход цикла, там, где у Вас сохраняется лот и тикет добавьте:
oldlots2 = oldlots;
ticket2 = ticket;
oldlots = OrderLots();
ticket = oldticket;
Получается так?
double FindLastLots (int otype)
{
double oldlots = 0, oldlots2 = 0 ; int oldticket;
ticket = 0;
ticket2 = 0; for (int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES ))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype )
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldlots2 = oldlots;
ticket2 = ticket;
oldlots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldlots2); }
Ну да, всё правильно. А что возвращать - сами решайте...
Блин, что то не то, сделал принт и соммент, чтобы посмотреть какой лот функция возвращает там 0.0 . Что то не так (((
Добавлено: 29-06-2015 22:23:03
ticket2 Я кстати вынес в глобальные или внешние переменные, не помню как правильно сказать )
Изменено 30 июня, 2015 пользователем Алексей7779000
Измените направление пересчёта в цикле:
вместо for (int i = OrdersTotal()-1; i>=0; i--)
сделайте for (int i = 0; i
Есть вроде простая функция трала:
//+------------------------------------------------------------------+
void Trailing()
{
for(int i =0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop * Point)
{
if(OrderStopLoss() {
SL =NormalizeDouble(Bid - TrailingStop * Point, Digits);
if (OrderStopLoss() != SL)
OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0);
}
}
}
if(OrderType() == OP_SELL)
{
if(OrderOpenPrice() - Ask > TrailingStop * Point)
{
if(OrderStopLoss() > Ask +(TrailingStop + TrailingStep) * Point)
{
SL =NormalizeDouble(Ask + TrailingStop * Point, Digits);
if (OrderStopLoss() != SL)
OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0);
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
Мне её надо прикрутить к сеточному советнику, я немного переделал её, чтобы трал срабатывал от последнего ордера, и стоп устанавливался сразу на ВСЕ открытые ордера, но ни хрена не работает.:
//+------------------------------------------------------------------+
void Trailing()
{
double asl = 0;
double asl1 = 0;
asl =NormalizeDouble(Bid - TrailingStop * Point, Digits);
asl1 =NormalizeDouble(Ask + TrailingStop * Point, Digits);
for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY)
{
if(Bid - FindLastBuyPrice() > TrailingStop * Point)
{
if(OrderStopLoss() {
SL = asl;
if (OrderStopLoss() != SL)
OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0);
}
}
}
if(OrderType() == OP_SELL)
{
if(FindLastSellPrice() - Ask > TrailingStop * Point)
{
if((OrderStopLoss() > Ask +(TrailingStop + TrailingStep) * Point) || OrderStopLoss() == 0)
{
SL = asl1;
if (OrderStopLoss() != SL)
OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0);
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
Саму функцию разместил в самом начале кода OnTick(). Получаеться она работает так, Открываеться сетка ордеров, Допустим Селл, и цена пошла вниз куда нам и надо, сработывает трал для самого последнего ордера, а все остальные не модифицируються, как только этот последний ордер закрываеться по стопу, начинаеться трал теперь ПРЕдпоследнего ордера, и т.д.
А надо чтобы трал модифицировал сразу все ордера, и после срабатывания стопа закрывалась вся сетка. Очень надеюсь на вашу помощь.
void Trailing()
{
double asl = 0;
double asl1 = 0;
asl =NormalizeDouble(Bid - TrailingStop * Point, Digits);
asl1 =NormalizeDouble(Ask + TrailingStop * Point, Digits);
for(int i = OrdersTotal()-1; i>=0; i--)
{
int j;
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY)
{
if(Bid - FindLastBuyPrice() > TrailingStop * Point)
{
if(OrderStopLoss() {
SL = asl;
for(j=i; j>=0; j--)
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY && OrderStopLoss() != SL)
OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0);
break;
}
}
}
if(OrderType() == OP_SELL)
{
if(FindLastSellPrice() - Ask > TrailingStop * Point)
{
if((OrderStopLoss() > Ask +(TrailingStop + TrailingStep) * Point) || OrderStopLoss() == 0)
{
SL = asl1;
for(j=i; j>=0; j--)
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL && OrderStopLoss() != SL)
OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0);
break;
}
}
}
}
}
}
}
Заранее извиняюсь, может не туда и не то!
Добрый день или вечер, нужна помощь, допилить советник,т.е. добавить туда еще несколько функций, пробовал сам не получается! Не хватает навыков((
Добавить необходимо количество открываемых ордеров желательно переменное число, или на худой конец 2 ордера, одинаковый СЛ и изменяемый ТП, возможность менять м.номер без танцев с бубнами, заранее спасибо, советник прилагаю!
Заранее извиняюсь, может не туда и не то!
Добрый день или вечер, нужна помощь, допилить советник,т.е. добавить туда еще несколько функций, пробовал сам не получается! Не хватает навыков((
Добавить необходимо количество открываемых ордеров желательно переменное число, или на худой конец 2 ордера, одинаковый СЛ и изменяемый ТП, возможность менять м.номер без танцев с бубнами, заранее спасибо, советник прилагаю!
добавил количество ордеров и вынес мэджик, но не проверял
Изменено 6 декабря, 2017 пользователем Pavel888
При компиляции выдает предупреждения ( скрин в приложениях). :-ss
extern double Lots = 0.1;
extern double StopLoss = 50;
extern double Takeprofit = 100;
extern int MovingPeriod1 = 8;
extern int MovingPeriod2 = 21;
extern int Slippage = 3;
extern int Magic = 123;
extern string comment = "Robot";
int ticket;
double Indicator1, Indicator2, SL, TP;
//----------------------------------
//----------------------------------
int OnInit()
{
if (Digits == 3 || Digits == 5);
{
Takeprofit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(INIT_SUCCEEDED);
}
//---------------------------------------------------
//---------------------------------------------------
void OnDeinit(const int reason)
{
}
//------------------------------------------------------
//----------------------------------------------------
void OnTick()
{
Indicator1 = iCustom (Symbol(), 0, "Moving Averenges", MovingPeriod1, 0,1);
Indicator2 = iCustom (Symbol(), 0, "Moving Averenges", MovingPeriod2, 0,1);
if(Indicator1 > Indicator2 && CountBuy() == 0)
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Ask + Takeprofit * Point, Digits);
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, 0);
if(ticket > 0)
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
if(Indicator1 SL = NormalizeDouble(Bid - StopLoss * Point, Digits);
TP = NormalizeDouble(Bid + Takeprofit * Point, Digits);
ticket = OrderSend(Symbol(), OP_SELL, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, 0);
bool modify1 = OrderModify(ticket, OrderOpenPrice(),SL, TP, 0);
if(ticket > 0)
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
//+------------------------------------------------------------------+
//---Проверка ордеров
int CountBuy()
{
int Count = 0;
for( int trade = OrdersTotal()-1; trade >=0; trade--)
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY)
Count++;
}
return(Count);
}
int CountSell()
{
int Count = 0;
for( int trade = OrdersTotal()-1; trade >=0; trade--)
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_SELL)
Count++;
}
return(Count);
}
Два нюанса, как я понимаю:
1) OrderSelect и OrderModify это функции, которые возвращают значения для дальнейшей проверки.
Соответственно программа видит что Вы не "выцепляете" эти значения
в строках типа (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);)
и подсказывает что Вы этот момент опустили. Но так как у Вас сделано тоже работать будет.
2) empty controlled statement found
Это у Вас If не корректно используется в строке:
if(Indicator1 > Indicator2 && CountBuy() == 0) (для этого условия нет дальнейших действий)
После If там наверное Вы фигурные скобки пропустили
Спасибо!
Подскажите куда конкретно нужно копировать данные настройки и именно в таком виде?
Копируй input в заголовки (к внешним переменным extern)Подскажите куда конкретно нужно копировать данные настройки и именно в таком виде?
вычисление workTime перед проверкой условий на вход
Доброго времени суток!!!
Смысл такой, если есть у кого советник, который работает на 3-х ма не коряво написанный, алгоритм:
3ма быстрый, средний и медленный;
на покупку быстрая ма пробивает среднюю, при этом обе выше медленной
продажа наоборот.
количество сделок по желанию, чтоб долго не расписывать выложу 1 сову, но алгоритм работы ее я не могу догнать,т.е. количество сделок подходит, есть трал и бу, но по сделкам зевает или открывает при касании быстрой ма -средней
У меня 3 или 4 штуки все написаны руками скотчем приклеенными, если есть у кого норм версии просьба поделиться!!!
Вставил так:
input int StartHour = 17; // Время начала работы
input int EndHour = 9; // Время окончания работы (открытия ордеров)
extern string Version = "1.00";
extern string _1 = "System Parameters";
extern bool Stealth = TRUE;
extern bool Agressive = TRUE;
extern double GmtOffset = 0.0;
extern bool AutoGmtOffset = TRUE;
extern int S1_Reference = 337733;
extern int S2_Reference = 773377;
extern string ReceiptCode = "";
extern string _2 = "Strategy Parameters";
extern int Slippage = 3;
extern bool SendEmails = FALSE;
extern string _3 = "Order Management";
extern double LotSize = 0.1;
extern string _4 = "Ratio Order Management";
extern double RiskLevel = 0.0;
extern bool RecoveryMode = TRUE;
extern string _5 = "Fixed Ratio Order Management";
extern bool UseFixedRatio = FALSE;
extern double BaseDeposit = 1000.0;
extern double StepRatio = 0.2;
extern bool ReduceLots = FALSE;
bool workTime = StartHour = StartHour && Hour() Hour() >= StartHour || Hour()
Ошибки нет но на работу советника не повлияло.
Может проще выложить советника и на примере покажете? спасибо
Там где открывает ордера не забыли вставить: if (workTime) Торгуем... ?
Если не получится - вставляй свою сову я допишу.
Коллеги, на нашем сайте была тема TradeManagement, которая содержала ряд простейших советников упрощающих торговлю. Первый советник e-CloseByLossOrProfit выполняет закрытие всех позиций при достижении общего по счёту заданного уровня убытка или прибыли в валюте депозита. Кроме того, этот советник может ещё и удалить отложенные ордера. Второй e-CloseByProfit выполняет закрытие всех позиций при достижении общего по счёту заданного уровня убытка или прибыли в пунктах.
ЗАДАЧА : скопировать функцию удаления отложенных ордеров уз первого советника во второй, т.е. e-CloseByProfit должен удалять отложенные ордера. Ниже исходники.Спасибо.
Скрестил. пробуй.
К сожалению советник живет своей жизнью и открывает сделки в любое время...
Доброго времени суток!!!
Смысл такой, если есть у кого советник, который работает на 3-х ма не коряво написанный, алгоритм:
3ма быстрый, средний и медленный;
на покупку быстрая ма пробивает среднюю, при этом обе выше медленной
продажа наоборот.
количество сделок по желанию, чтоб долго не расписывать выложу 1 сову, но алгоритм работы ее я не могу догнать,т.е. количество сделок подходит, есть трал и бу, но по сделкам зевает или открывает при касании быстрой ма -средней
У меня 3 или 4 штуки все написаны руками скотчем приклеенными, если есть у кого норм версии просьба поделиться!!!
Посмотри теперь должна открывать только когда средняя и быстрая МА выше или ниже медленной, если еще актуально.
Изменено 6 декабря, 2017 пользователем Pavel888
День добрый.
Хотелось бы позаниматься с этим:
/sovetniki-foreks/11/sovetnik-quotkalmarquot/7312/?do=findComment&comment=225903
Убрал многолотность и прогнал с настройками "на глазок"

Но для дальнейшей работы желательно добавить тайм-фильтр.
Поэтому просьба:
пожалуйста вставьте вот этот тайм-фильтр:
extern string S1 = " DayOfWeek Filter";
extern bool monday = true;
extern string monday_open = "20:00";
extern string monday_pause_start = "0";
extern string monday_pause_stop = "0";
extern string monday_close = "23:50";
extern bool tuesday = false;
extern string tuesday_open = "20:00";
extern string tuesday_pause_start = "0";
extern string tuesday_pause_stop = "0";
extern string tuesday_close = "23:50";
extern bool wednesday = true;
extern string wednesday_open = "20:00";
extern string wednesday_pause_start = "0";
extern string wednesday_pause_stop = "0";
extern string wednesday_close = "23:50";
extern bool thursday = true;
extern string thursday_open = "20:00";
extern string thursday_pause_start = "0";
extern string thursday_pause_stop = "0";
extern string thursday_close = "23:50";
extern bool friday = false;
extern string friday_open = "08:30";
extern string friday_pause_start = "15:30";
extern string friday_pause_stop = "17:55";
extern string friday_close = "21:35";
extern bool sunday = false;
extern string sunday_open = "08:30";
extern string sunday_pause_start = "15:30";
extern string sunday_pause_stop = "17:55";
extern string sunday_close = "21:35";
+++++++++++++++++++++++++++++++++++
bool IsTime()
{
switch(DayOfWeek())
{
case 0: {
return(sunday && IsNow(sunday_open,sunday_pause_start,sunday_pause_stop,sunday_close));
break;
}
case 1: {
return(monday && IsNow(monday_open,monday_pause_start,monday_pause_stop,monday_close));
break;
}
case 2: {
return(tuesday && IsNow(tuesday_open,tuesday_pause_start,tuesday_pause_stop,tuesday_close));
break;
}
case 3: {
return(wednesday && IsNow(wednesday_open,wednesday_pause_start,wednesday_pause_stop,wednesday_close));
break;
}
case 4: {
return(thursday && IsNow(thursday_open,thursday_pause_start,thursday_pause_stop,thursday_close));
break;
}
case 5: {
return(friday && IsNow(friday_open,friday_pause_start,friday_pause_stop,friday_close));
break;
}
default:{
return(false);
}
}
}
bool IsNow(string open,string pause_start,string pause_stop,string close)
{
if((pause_start == "0")||((pause_start == open)&&(pause_stop == close)))
{
//no pause
return((TimeCurrent() >= StrToTime(open)) && (TimeCurrent()
}
else // pause
{
return(((TimeCurrent() >= StrToTime(open)) && (TimeCurrent() ((TimeCurrent() >= StrToTime(pause_stop)) && (TimeCurrent() }
return(false);
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем