Научить советник ожидать новое событие

 

Пишу советник похожий по принципу на тот, который описан в примере. Т.е. ордера открываются (закрываются) на пересечении МА или других похожих индикаторов.

Но возник вопрос: как научиться советник ждать новый критерий входа на рынок, а не анализировать текущий ?!

Для примера возьмём торговлю по стратегии Пуриа _http://strategy4you.ru/skalpiruyushhie-strategii-foreks/metod-puria.html . Там точками входа являются пересечения МА и показания МАКД.

Сейчас у меня возникает такая картина:

На графике видно, что советник открыл ордер по точке входа от 1 Feb 07:00 (немного правее от неё) . Но на момент написания поста тренд скорее всего изживет себя и сделка скорее всего закроется по SL.

Вот как научить советник отркывать ордера не по текущей ситуации, а ждать нового критерия входа -- нового пересечения МА и соотв. данных от MACD . Если такая тема уже есть, то дайте пожалуйста ссылку :)

 
PAZITIV:

Пишу советник похожий по принципу на тот, который описан в примере. Т.е. ордера открываются (закрываются) на пересечении МА или других похожих индикаторов.

Но возник вопрос: как научиться советник ждать новый критерий входа на рынок, а не анализировать текущий ?!

Для примера возьмём торговлю по стратегии Пуриа _http://strategy4you.ru/skalpiruyushhie-strategii-foreks/metod-puria.html . Там точками входа являются пересечения МА и показания МАКД.

Сейчас у меня возникает такая картина:

На графике видно, что советник открыл ордер по точке входа от 1 Feb 07:00 (немного правее от неё) . Но на момент написания поста тренд скорее всего изживет себя и сделка скорее всего закроется по SL.

Вот как научить советник отркывать ордера не по текущей ситуации, а ждать нового критерия входа -- нового пересечения МА и соотв. данных от MACD . Если такая тема уже есть, то дайте пожалуйста ссылку :)

Тема рассматривалась в ветке: "Любые вопросы от новичков..." (эпизод не помню). Необходимо использовать флаги - их ставить и сбрасывать - и все.

 
PAZITIV:


Но возник вопрос: как научиться советник ждать новый критерий входа на рынок, а не анализировать текущий ?!

Элементарно, Ватсон. Отложками.
 
PAZITIV:
...

Вот как научить советник отркывать ордера не по текущей ситуации, а ждать нового критерия входа -- нового пересечения МА и соотв. данных от MACD . Если такая тема уже есть, то дайте пожалуйста ссылку :)

Вот статья - c подобными Вашим условиям входа в рынок... Подход - один.

Вот реализация в коде - инклюд Критерион - по учебнику.

//--------------------------------------------------------------------
// Criterion.mqh
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
// Функция вычисления торговых критериев.
// Возвращаемые значения:
// 10 - открытие Buy  
// 20 - открытие Sell 
// 11 - закрытие Buy
// 21 - закрытие Sell
// 0  - значимых критериев нет
// -1 - используется другой финансовый инструмент
//--------------------------------------------------------------- 2 --
// Внешние переменные:
extern string A5 = "Параметры";
extern int Tenkan=9;
extern int Kijun=26;
extern int Senkou=52;
extern int FlatSE=7;

extern int DeMarker=25;
extern int FastMA=14;
extern int SlowMA=25;
extern double DeMarker_OpenLevel_Sell = 0.7;
extern double DeMarker_OpenLevel_Buy = 0.7;
bool   DeMarker_Buy_signal=false, DeMarker_Sell_signal=false,
       MA_Buy_signal=false, MA_Sell_signal=false;


//--------------------------------------------------------------- 3 --
int Criterion()                        // Пользовательская функция
  {
      
   int trend_period=GetPeriod(t_trend_period);    
//--------------------------------------------------------------- 4 --
   // Параметры технич. индикат:
   
              
double Taichi_1 = iCustom (Symbol(), trend_period, "Cronex Taichi",Tenkan, Kijun, Senkou, FlatSE, 0, 1);
double TaichiFor_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 3, 1);
double Signal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 1, 1);
double SSignal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 2, 1);

double FlatBuffer1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 4, 1);
double FlatBuffer2 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 5, 1);

double DeMarker_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 1);
double DeMarker_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 2);

double FastMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 1);
double FastMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 2);

double SlowMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 1);
double SlowMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 2);


//--------------------------------------------------------------- 5 --
   // Вычисление торговых критериев
   
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (DeMarker_Buy_signal == true && DeMarker_Sell_signal==false)) &&  // когда DeMarker пересекает медленую (выше уровня бай (0.7)) для лонг
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (MA_Buy_signal==true && MA_Sell_signal==false)) && // пересечение МА DeMarkers
   
   
      (iClose(Symbol(), trend_period,1) > Taichi_1 && Taichi_1 > TaichiFor_1 && Signal_1 > SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
     
         {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(10);                      // Открытие Buy    
         }
  
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (DeMarker_Buy_signal==false && DeMarker_Sell_signal==true)) &&  // когда DeMarker пересекает медленую (ниже уровня селл) для шорт
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (MA_Buy_signal==false && MA_Sell_signal==true)) && // пересечение МА DeMarkers
        
      (iClose(Symbol(), trend_period,1) < Taichi_1 && Taichi_1 < TaichiFor_1 && Signal_1 < SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
        {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(20);  
        }                       // Открытие Sell 
   
//--------------------------------------------------------------- 6 --
   return(0);                          // Выход из пользов. функции
  }
//--------------------------------------------------------------- 7 --

//для оптимизации по всем ТФ
int GetPeriod(int period)
{int periodres;
 switch(period)
  {
   case 1: periodres=1;break;
   case 2: periodres=5;break;
   case 3: periodres=15;break;
   case 4: periodres=30;break;
   case 5: periodres=60;break;
   case 6: periodres=240;break;
   case 7: periodres=1440;break;
   case 8: periodres=10080;break;
   default: periodres=1;break;
  }
return(periodres);
} 


int type_op_DeMarker(double D1, double D2, double F1, double F2, double S1,double S2)// Функция - условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               
{
      
     if (D2-S2 < 0 && D1-S1 > 0 && D1 > F1  && D1 < DeMarker_OpenLevel_Buy)
          {
             DeMarker_Buy_signal=true;
             DeMarker_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (D2-S2 > 0 && D1-S1 < 0 && D1 < F1 && D1 > DeMarker_OpenLevel_Sell)                                                                                                                 
          {
             DeMarker_Buy_signal=false;
             DeMarker_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);
     
}

int type_op_MA(double d1, double d2, double f1, double f2, double s1,double s2)  // Функция МЕТА_СОТ - условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               

  {
          
     if (f2 - s2 < 0 && f1 - s1 > 0)
          {
             MA_Buy_signal=true;
             MA_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (f2-s2 > 0 && f1-s1 < 0)                                                                                                                 
          {
             MA_Buy_signal=false;
             MA_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);

  }









 
Roman.:

Вот статья - c подобными Вашим условиям входа в рынок... Подход - один.

Вот реализация в коде - инклюд Критерион - по учебнику.



ух.. легче тонда уже вручную один раз вовремя запустить

а попроще никак нельзя сделать?!

 

По времени, запоминайте время события (пересечения предположим) в глобальной переменной, и потом сравнимвайте, как только время нового события больше - новый ордер, и опять запоминаем

Можно время напрямую в мажик писать, тогда уж точно никак не пропадет.

 
PAZITIV:



ух.. легче тонда уже вручную один раз вовремя запустить

а попроще никак нельзя сделать?!

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