Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 105

 
Forexman77:


Добрый день!

Извините, что поднимаю сравнительно давнюю тему. С кодом стало все понятно.

Теперь у меня загвоздка, как открыть сделку. К примеру, сразу после заданного диапазона ищем

цену меньше максимума, на определенное количество пунктов. Входим в сделку.

Попробовал добавить вот такой код и прогнать в тестере, не открываются сделки.

Как быть?

Вот так должно работать, сам не проверял, т.к. терминал пока занят оптимизацией другого советника

#define magic 123456789
extern int StartHour=16;
extern int StartMinute=1;
extern int StopHour=17;
extern int 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(){
 static double 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.1970
 if(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.1970
  int start= iBarShift(Symbol(),PERIOD_M1,ts,false);// смещение бара, которому принадлежит ts
  ts=td+StopTime*60;// конец временного диапазона в секундах от 01.01.1970
  int 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);
}
 
Sepulca:

Вот так должно работать, сам не проверял, т.к. терминал пока занят оптимизацией другого советника

Спасибо!
 
Sepulca:

Вот так должно работать, сам не проверял, т.к. терминал пока занят оптимизацией другого советника


// В 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;
Эту строку можно убрать или без нее не будет работать? Не могу понять зачем закрывать ордер?
 
Forexman77:

Эту строку можно убрать или без нее не будет работать? Не могу понять зачем закрывать ордер?

Конечно можно убрать, это для того что бы просто потестить и не плодить много открытых ордеров. Это лишь учебный пример советника. Он в день открывает не более одного SELL-ордера. А в своем советнике Вы должны сами решить как закрывать ордера: по стоплосу или тейкпрофиту, или по другим условиям. Время 22:55 выбрано потому что у многих ДЦ особенно в пятницу после 23:00 резко увеличивается спрэд. Можно подумать чтобы не один ордер в день открывать. И это пример для ордера в одну сторону. По аналогии надо искать и минимум. Этот код в качестве примера, надеюсь облегчит создание собственного советника)
 

Здравствуйте!

Я чайник, но хочу хоть что то менять в коде самостоятельно…

Подскажите, кому не жаль своего времени…

У меня несколько вопросов:

1. Как советнику добавить переменную «стоп лосс» ? ну естественно чтоб ее можно было менять.

2. Где что прописать, чтоб советник добавлял комментарий к каждой своей сделке?

3. Как добавить советнику мейджик номер?

 
K-o-t:

Здравствуйте!

Я чайник, но хочу хоть что то менять в коде самостоятельно…

Подскажите, кому не жаль своего времени…

У меня несколько вопросов:

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. ЧИТАТЬ!

 
artmedia70:

Вот косяк:

 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();   // Тогда время открытия последней закрытой позиции из истории
   }
Вообще-то да, с утра на свежую голову поглядел. Тут получается, что первый ордер, который имеет прибыль более требуемого, даёт сигнал на продолжение выполнение функции (т.е. не пропускается) и дальше есс-но уже будет всё не правильно.
 

День добрый!

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

 
filpan:

День добрый!

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

В закладке с результатами оптимизации на любом результате нажмите правой мышкой и снимите галочку с "не показывать бесполезные результаты" (или что-то типа того).
 
Нашел, спасибо!
Причина обращения: