Извините, что поднимаю сравнительно давнюю тему. С кодом стало все понятно.
Теперь у меня загвоздка, как открыть сделку. К примеру, сразу после заданного диапазона ищем
цену меньше максимума, на определенное количество пунктов. Входим в сделку.
Попробовал добавить вот такой код и прогнать в тестере, не открываются сделки.
Как быть?
Вот так должно работать, сам не проверял, т.к. терминал пока занят оптимизацией другого советника
#define magic 123456789externint StartHour=16;
externint StartMinute=1;
externint StopHour=17;
externint StopMinute=59;
bool Flag=true; // Флаг разрешения открытия позиции, чтобы не плодить бесконечное число ордеровdouble lots=0.1;// размер лотаdouble sl=100; // стоплосс в пунктахdouble tp=100; // тейкпрофит в пунктахint ticket=-1;
int OldBar;
int init() {
sl=NormalizeDouble(sl*Point,Digits);//стоплосс в поинтах
tp=NormalizeDouble(tp*Point,Digits);//тейкпрофит в поинтахreturn(0);}
int deinit() {return(0);}
int start(){
staticdouble Maximum=-1;
int StartTime=StartHour*60+StartMinute;
int StopTime=StopHour*60+StopMinute;
if(StopTime<=StartTime) {Print("ERROR: Неправильные времена"); return(0);}
int CurrentMinutesFromDayStart=Hour()*60+Minute();// Текущее время в минутах от начала дняdatetime td=iTime(Symbol(),PERIOD_D1,0);// Время открытия дневного бара в секундах от 01.01.1970if(CurrentMinutesFromDayStart<StartTime) {Maximum=-1;Flag=true;}// Если StartTime еще не настало, то после StopTime нужно пересчитать Maximum и можно открывать ордер// В 22:55 Принудительно закрываем ордерif(CurrentMinutesFromDayStart>22*60+55 && ticket>=0) if(OrderSelect(ticket,SELECT_BY_TICKET)) if(OrderCloseTime()==0) if(OrderClose(ticket,OrderLots(),Ask,30,Magenta)) ticket=-1;
if(CurrentMinutesFromDayStart>StopTime && Maximum<0) {// если максимум ещё не посчитанdatetime ts=td+StartTime*60;// начало временного диапазона в секундах от 01.01.1970int start= iBarShift(Symbol(),PERIOD_M1,ts,false);// смещение бара, которому принадлежит ts
ts=td+StopTime*60;// конец временного диапазона в секундах от 01.01.1970int count= iBarShift(Symbol(),PERIOD_M1,ts,false);// смещение бара, которому принадлежит ts
count=start-count;// Сколко баров длится временной интервал
Maximum=iHigh(Symbol(),PERIOD_M1,iHighest(Symbol(),PERIOD_M1,MODE_HIGH,count,start));//Находим максимум на заданном временном интервале
}
if(Maximum>0 && Flag) {
double signal = Maximum - Bid;
if (signal-12*Point>0.0) { // к примеру если ниже максимума на 12 пунктов, в этом случае откроем SELL
ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,30,Ask+sl,Ask-tp,"My order",magic,0,Blue);
if(ticket>=0) Flag=false;// Ордер открылся, сегодня больше не открываем.
}
}
return(0);
}
Эту строку можно убрать или без нее не будет работать? Не могу понять зачем закрывать ордер?
Конечно можно убрать, это для того что бы просто потестить и не плодить много открытых ордеров. Это лишь учебный пример советника. Он в день открывает не более одного SELL-ордера. А в своем советнике Вы должны сами решить как закрывать ордера: по стоплосу или тейкпрофиту, или по другим условиям. Время 22:55 выбрано потому что у многих ДЦ особенно в пятницу после 23:00 резко увеличивается спрэд. Можно подумать чтобы не один ордер в день открывать. И это пример для ордера в одну сторону. По аналогии надо искать и минимум. Этот код в качестве примера, надеюсь облегчит создание собственного советника)
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderMagicNumber() != i_magic) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() > 1) continue; // Все удалённые отложки нас не интересуют..if (lastOrderCloseTime < OrderCloseTime()) // Находим время закрытия..
lastOrderCloseTime = OrderCloseTime(); // ..последней закрытой позиции в историиif (MathAbs(OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return(0); // ЗДЕСЬ ВЫХОДИМ ПРИ ПЕРВОМ ВСТРЕЧНОМ
lastOOTHist = OrderOpenTime(); // Тогда время открытия последней закрытой позиции из истории
}
Вообще-то да, с утра на свежую голову поглядел. Тут получается, что первый ордер, который имеет прибыль более требуемого, даёт сигнал на продолжение выполнение функции (т.е. не пропускается) и дальше есс-но уже будет всё не правильно.
Подскажите как настроить оптимизацию эксперта, чтобы он показывал и отрицательные результаты прохода?
В закладке с результатами оптимизации на любом результате нажмите правой мышкой и снимите галочку с "не показывать бесполезные результаты" (или что-то типа того).
Добрый день!
Извините, что поднимаю сравнительно давнюю тему. С кодом стало все понятно.
Теперь у меня загвоздка, как открыть сделку. К примеру, сразу после заданного диапазона ищем
цену меньше максимума, на определенное количество пунктов. Входим в сделку.
Попробовал добавить вот такой код и прогнать в тестере, не открываются сделки.
Как быть?
Вот так должно работать, сам не проверял, т.к. терминал пока занят оптимизацией другого советника
Вот так должно работать, сам не проверял, т.к. терминал пока занят оптимизацией другого советника
Вот так должно работать, сам не проверял, т.к. терминал пока занят оптимизацией другого советника
Эту строку можно убрать или без нее не будет работать? Не могу понять зачем закрывать ордер?
Эту строку можно убрать или без нее не будет работать? Не могу понять зачем закрывать ордер?
Конечно можно убрать, это для того что бы просто потестить и не плодить много открытых ордеров. Это лишь учебный пример советника. Он в день открывает не более одного SELL-ордера. А в своем советнике Вы должны сами решить как закрывать ордера: по стоплосу или тейкпрофиту, или по другим условиям. Время 22:55 выбрано потому что у многих ДЦ особенно в пятницу после 23:00 резко увеличивается спрэд. Можно подумать чтобы не один ордер в день открывать. И это пример для ордера в одну сторону. По аналогии надо искать и минимум. Этот код в качестве примера, надеюсь облегчит создание собственного советника)
Здравствуйте!
Я чайник, но хочу хоть что то менять в коде самостоятельно…
Подскажите, кому не жаль своего времени…
У меня несколько вопросов:
1. Как советнику добавить переменную «стоп лосс» ? ну естественно чтоб ее можно было менять.
2. Где что прописать, чтоб советник добавлял комментарий к каждой своей сделке?
3. Как добавить советнику мейджик номер?
Здравствуйте!
Я чайник, но хочу хоть что то менять в коде самостоятельно…
Подскажите, кому не жаль своего времени…
У меня несколько вопросов:
1. Как советнику добавить переменную «стоп лосс» ? ну естественно чтоб ее можно было менять.
2. Где что прописать, чтоб советник добавлял комментарий к каждой своей сделке?
3. Как добавить советнику мейджик номер?
1. external double StopLoss=100.0;// добавили переменную "стоп лосс"
2-3. int ticket=OrderSend(Symbol, TypeOfOrder,LotsOfOrder, OpenPriceOfOrder, Slippage, OpenPriceOfOrder+/-StopLoss, OpenPriceOfOrder-/+TakeProfit, "Ваш комментарий к ордеру",YourMagicNumber, 0, CLR_NONE) ;
4. ЧИТАТЬ!
Вот косяк:
День добрый!
Подскажите как настроить оптимизацию эксперта, чтобы он показывал и отрицательные результаты прохода?
День добрый!
Подскажите как настроить оптимизацию эксперта, чтобы он показывал и отрицательные результаты прохода?