проблема с фракталами. плиз хелп!!!!

 

уважаемые программисты. помогите новичку. вот уже вторую неделю не могу разобраться в чем проблема. (пытаюсь написать советника который ставит отложенные ордера по фракталам, определил уровни фракталов//благо есть поиск//, но отложенные ордера по этим уровням выставляет на каждом тике... не могу понять, что не так. помогите рахобраться

//+------------------------------------------------------------------+
//|                                                      Fractal.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+

extern int    TakeProfit=10;
extern int    offset=2;  //отступ от фрактала на пробитие
       int    magic=2709;
       int    spread; 
extern double Lots=0.1;
       double tick;
       double FrUp,FrDw;
 

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//------------------------------
      spread   =MarketInfo(Symbol(), MODE_SPREAD);
      tick     =MarketInfo(Symbol(), MODE_TICKSIZE);
  int StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL); // проверка соотвествия тейка и лоса значению TakeProfit
   
   if (TakeProfit<StopLevel)
      {
      Alert ("введите новое значение TakeProfit, min=", StopLevel);
      return (0);
      }    
//---------------------------------

//--------------------------------
   return;
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

//-------------------------------------
int start ()
{
//-----------------------



// определение фракталов  --------------------------------------------                  
string symbol = Symbol(); int timeframe = Period();
double FrUp = GetPriceLastFractal(symbol, timeframe, 0);
double FrDw = GetPriceLastFractal(symbol, timeframe, 1);
//-----------------------


   // окрытие Buy 
   double price_b = FrUp+(spread+offset)*tick; // определение цены "Ask" для открытия ордера buy
   double TP_b    = price_b+TakeProfit*tick;
   double SL_b    = FrDw-offset*tick;

   int ticket_b   = OrderSend(Symbol(),OP_BUYSTOP,Lots,price_b,0,SL_b,TP_b,NULL,magic,0,Green);

   
//-------------------------------  
 

   // открытие sell
   double price_s = FrDw-offset*tick; // определение цены Bid для отерытия ордера Sell
   double TP_s    = price_s-TakeProfit*tick; 
   double SL_s    = FrUp+(spread+offset)*tick;

   int ticket_s   = OrderSend(Symbol(),OP_SELLSTOP,Lots,price_s,0,SL_s,TP_s,NULL,magic,0,Red);
 

//--------------------------------
   
return;
} 
 
//+---------------------------------------------------------------------+
//| GetPriceLastFractal(string symbol, int timeframe, int mode) function|//эту часть кода нашел на форуме. автору благодарен!!!                                                |
//+---------------------------------------------------------------------+
double GetPriceLastFractal(string symbol, int timeframe, int mode)
   { 
     double currprice;
     int i;
     if (mode == 0)
       {
        while (currprice <= iHigh(symbol,timeframe,0))
          {if (i>=iBars(symbol,timeframe)-5) return(0); // Превышен исторический Max графика
           currprice = iFractals(symbol, timeframe, MODE_UPPER,i);i++;}       
        return(currprice);
       }
     else
       {
         while (currprice == 0 || currprice >=iLow(symbol,timeframe,0))
           {if (i>=iBars(symbol,timeframe)-5) return(0); // Превышен исторический Min графика
            currprice = iFractals(symbol, timeframe, MODE_LOWER,i);i++;}       
        return(currprice);
       } 
   } 
 
dmmikl86 >>:

уважаемые программисты. помогите новичку. вот уже вторую неделю не могу разобраться в чем проблема. (пытаюсь написать советника который ставит отложенные ордера по фракталам, определил уровни фракталов//благо есть поиск//, но отложенные ордера по этим уровням выставляет на каждом тике... не могу понять, что не так. помогите рахобраться


Для начала,я не вижу у вас в коде ни одного условия установки ордеров. Вообщето делается так:

ставится условие if(MA0 >MA1){то делается вот это}

у вас же нет условия запрета/разрешения на установку отложек, поэтому естевственно они будут устанавливаться на каждом тике, тем более что установка отложек не требует маржевого покрытия(вот их исполнение уже да).

 
Urain >>:

Для начала,я не вижу у вас в коде ни одного условия установки ордеров. Вообщето делается так:

ставится условие if(MA0 >MA1){то делается вот это}

у вас же нет условия запрета/разрешения на установку отложек, поэтому естевственно они будут устанавливаться на каждом тике, тем более что установка отложек не требует маржевого покрытия(вот их исполнение уже да).

а в данном случае что будет место MA0>Ma1?

у меня то с этим и проблема условием:

if(FrUp>чему-то/ наверное переменной newFrUp)

  тогда OrderSend.

Вопрос как как сравнить тогда значения только что сформировавшегося фрактала(newFrUp) и уже существующего?(FrUp)

 
dmmikl86 >>:

а в данном случае что будет место MA0>Ma1?

у меня то с этим и проблема условием:

if(FrUp>чему-то/ наверное переменной newFrUp)

  тогда OrderSend.

Вопрос как как сравнить тогда значения только что сформировавшегося фрактала(newFrUp) и уже существующего?(FrUp)

Ну я же не знаю какие вы хотите задать условия. Для начала посмотрите что возвращает

iFractals(symbol, timeframe, MODE_UPPER,i); и iFractals(symbol, timeframe, MODE_LOWER,i); на каком баре и исходя из этого принимайте решение какое должно быть условие.

                                                              Прикрепляю библиотеку для вывода значений буфере в файл .txt

Файлы:
file_txt.mq4  1 kb
 
Urain >>:

Ну я же не знаю какие вы хотите задать условия. Для начала посмотрите что возвращает

iFractals(symbol, timeframe, MODE_UPPER,i); и iFractals(symbol, timeframe, MODE_LOWER,i); на каком баре и исходя из этого принимайте решение какое должно быть условие.

                                                              Прикрепляю библиотеку для вывода значений буфере в файл .txt

функция iFractals - возращает мне значения верхнего и нижнего последнего фрактала на каждом тике.

спасибо за библиотеку в запись файл.

я так понял что он записывает значение Array[i], правильно?

если записывать значени последние выданое iFractals(например FrUp), потом производить чтение файла и это значение присвоить переменой (newFrUp) и сравнить их через условие

if(newFrUp!=FrUP)

тогда открываем ордер по FrUp и записываем в файл это значение.  (это будет работать)

 
dmmikl86 писал(а) >>

функция iFractals - возращает мне значения верхнего и нижнего последнего фрактала на каждом тике.

А зачем на каждом тике. Вроде бы для формирования фрактала нужны бары, и не один. А как минимум три. Ну зачем же систему нагружать излишними вычислениями

 

По поводу условия можно так сделать 

if (Order==0)
   {
   int ticket_b   = OrderSend(Symbol(),OP_BUYSTOP,Lots,price_b,0,SL_b,TP_b,NULL,magic,0,Green);
   Order=1;
   }


 А когда ордер закрывается, то снова присваиваем Order=0.

Я всегда так делаю. Тогда ордера не будут устанавливаться на каждом тике.

 
FOReignEXchange >>:

По поводу условия можно так сделать 


 А когда ордер закрывается, то снова присваиваем Order=0.

Я всегда так делаю. Тогда ордера не будут устанавливаться на каждом тике.


хорошая идея. спасибо. буду пробывать....

вот попробывал получилось такое:

// определение фракталов  --------------------------------------------                  
string symbol = Symbol(); int timeframe = Period();
double FrUp = GetPriceLastFractal(symbol, timeframe, 0);
double FrDw = GetPriceLastFractal(symbol, timeframe, 1);
//-----------------------
// окрытие Buy 
   double price_b = FrUp+(spread+offset)*tick; // определение цены "Ask" для открытия ордера buy
   double TP_b    = price_b+TakeProfit*tick;
   double SL_b    = FrDw-offset*tick;
int Order=OrdersTotal();;
if (Order==0)
   {
   int ticket_b   = OrderSend(Symbol(),OP_BUYSTOP,Lots,price_b,0,SL_b,TP_b,NULL,magic,0,Green);
   Order=1;
   }

остался вопрос: а как определить что ордер закрылся? через фунцию orderclose?

 

У меня такое стоит на одном из советников

if(OrderSelect(ticket_2, SELECT_BY_TICKET,MODE_HISTORY)==true)
  {
  t_close_2=OrderCloseTime();
  if (t_close_2!=0) 
     {
     t_close_2=0;
     ticket_2=0;
     }
  } 
 
Для вашего случая будет ticcket_b, t_close_b   вместо моих переменных. Ну и внутрь операторов надо ставить Order=0.  Вобщем кака-так. Приспосабливывавывовайте вобщем.
 
Ах да. Вместо переменной Order можно использовать ticket_b вообще-то. Только когда ордер отрывается тикет не равен нулю. Ну Вы поняли.
Причина обращения: