Советник на основе Фибо

 

Друзья, кто может помочь, нужно в код экспа добавить функцию, которая бы расчитывала расстояние между линиями фибо от 0 до 100%. Т.Е. при условии что измеренное значение меньше такого-то значения в пунктах заданного в настройках - ордер не ставим. Смысл алгоритма: на основе последней линии зигзага тянем сетку фибоначчи, и ставим ордер на пробой уровня в обратную сторону. Если расстояние между линиями фибо не велико - ордер не разрешаем выставлять.

Премного благодарен.

extern int           ZZ_ExtDepth=12;
extern int           ZZ_ExtDeviation=5;
extern int           ZZ_ExtBackstep=3;
extern double        Lots=0.1;
extern double        OpenLevelPercent=61;
extern double        TakeProfitPercent=23;
extern double        StopLossPercent=100;
extern int           TrailStop=0;
extern int           TrailStep=5;
extern int           BezubLevel=0;
extern int           BezubSize=10;
extern string        OrdersComment="Fibo";

int                  MAGIC,BS,STP,SPR,tick,ticknum,DigLots;
double               Lot,ur,sl,tp,MaxLots,MinLots,StepLots,pnt;
string               CMM,txt;
bool                 sb,ss;
datetime             lft;

int init()//==================================================================================================
{
   if (!IsExpertEnabled() && !IsTesting()) Comment("Запуск советников в терминале запрещён! Нажмите кнопку \"Советники\" на панели инструментов.");
   ObjectCreate("Copyright",OBJ_LABEL,0,0,1.0);
   ObjectSet("Copyright", OBJPROP_CORNER, 2);
   ObjectSet("Copyright", OBJPROP_XDISTANCE, 3);
   ObjectSet("Copyright", OBJPROP_YDISTANCE, 1);
   txt="Shurka "+CharToStr(174)+" SHFOREX.NAROD.RU";
   ObjectSetText("Copyright",txt,8,"Times New Roman",Tomato);
   ObjectSet("Copyright",OBJPROP_TIMEFRAMES,NULL);
   ObjectSet("Copyright",OBJPROP_BACK,false);
   MAGIC=231109+Period()*100000;
   // Определение размера лота
   MaxLots=MarketInfo(Symbol(),MODE_MAXLOT);
   MinLots=MarketInfo(Symbol(),MODE_MINLOT);
   StepLots=MarketInfo(Symbol(),MODE_LOTSTEP);
   if(StepLots<=0.009) DigLots=3; else if(StepLots<=0.09) DigLots=2; else if(StepLots<=0.9) DigLots=1; else DigLots=0;
   Lot=NRL(Lots);
   CMM=OrdersComment+" Magic#="+MAGIC;
   sb=false; ss=false;
   return(0);
}
int deinit() { ObjectDelete("Copyright"); Comment(""); return(0); }
//============================================================================================================
// Основная функция
int start()
{
   int      i;
   // Проверка доступности торговли.
   if(!IsTesting())
   {
      if(!IsExpertEnabled()) { Comment("В торговом терминале запрещён запуск экспертов."); return(0); } else
      if(!IsTradeAllowed()) { Comment("Торговля запрещена или торговый поток занят."); return(0); } else Comment("");
   }
   pnt=MarketInfo(Symbol(),MODE_TICKSIZE);
   STP=MarketInfo(Symbol(),MODE_STOPLEVEL);
   SPR=MarketInfo(Symbol(),MODE_SPREAD);
   // Определение направления торгов
   ZZ();
   // Проверяем все открытые ордера---------------------------------------------------------------------------
   for(i=OrdersTotal()-1;i>=0;i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;
      if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) continue;
      if(OrderType()==OP_SELL)
      {
         if(BezubLevel>0)
         {
            sl=NR(OrderOpenPrice()-BezubSize*Point);
            if(OrderOpenPrice()-Ask>BezubLevel*Point && (OrderStopLoss()>sl || OrderStopLoss()==0) && Ask+STP*Point<=sl)
               OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
         }
         if(TrailStop>STP && TrailStop>0 && (( BezubLevel>0 && OrderStopLoss()<=OrderOpenPrice() && OrderStopLoss()>0) || BezubLevel<=0))
         {
            if(OrderOpenPrice()-Ask>TrailStop*Point && (OrderStopLoss()>OrderOpenPrice() || OrderStopLoss()==0))
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,CLR_NONE);
            else if(OrderOpenPrice()-Ask>TrailStop*Point && OrderStopLoss()>Ask+(TrailStop+TrailStep)*Point
            && OrderStopLoss()<=OrderOpenPrice())
               OrderModify(OrderTicket(),OrderOpenPrice(),NR(Ask+TrailStop*Point),OrderTakeProfit(),0);
         }
      } else
      if(OrderType()==OP_BUY)
      {
         if(BezubLevel>0)
         {
            sl=NR(OrderOpenPrice()+BezubSize*Point);
            if(Bid-OrderOpenPrice()>BezubLevel*Point && OrderStopLoss()<sl && Bid-STP*Point>=sl)
               OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
         }
         if(TrailStop>STP && TrailStop>0 && ((BezubLevel>0 && OrderStopLoss()>=OrderOpenPrice()) || BezubLevel==0))
         {
            if(Bid-OrderOpenPrice()>TrailStop*Point && OrderStopLoss()<OrderOpenPrice())
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,CLR_NONE);
            else if(Bid-OrderOpenPrice()>TrailStop*Point && OrderStopLoss()<Bid-(TrailStop+TrailStep)*Point
            && OrderStopLoss()>=OrderOpenPrice())
               OrderModify(OrderTicket(),OrderOpenPrice(),NR(Bid-TrailStop*Point),OrderTakeProfit(),0);
         }
      } else
      if(OrderType()==OP_SELLSTOP && BS==OP_SELL && OrderOpenTime()>lft)
      {
         ss=true;
         if(NR(OrderOpenPrice())!=ur) OrderModify(OrderTicket(),ur,sl,tp,0);
      } else
      if(OrderType()==OP_BUYSTOP && BS==OP_BUY && OrderOpenTime()>lft)
      {
         sb=true;
         if(NR(OrderStopLoss())!=sl) OrderModify(OrderTicket(),ur,sl,tp,0);
      }
   }
   RefreshRates();
   if(BS==OP_BUY && !sb)
   {
      if(ur<Ask+STP*Point) return(0);
      tick=OrderSend(Symbol(),OP_BUYSTOP,Lot,ur,0,sl,tp,CMM,MAGIC,0,Red);
      if(tick>0)
      {
         ticknum=0;
         while(ticknum<90 && !OrderSelect(tick,SELECT_BY_TICKET))
         {
            ticknum++; Sleep(2000);
         }
      }
   } else
   if(BS==OP_SELL && !ss)
   {
      if(ur>Bid-STP*Point) return(0);
      tick=OrderSend(Symbol(),OP_SELLSTOP,Lot,ur,0,sl,tp,CMM,MAGIC,0,Blue);
      if(tick>0)
      {
         ticknum=0;
         while(ticknum<90 && !OrderSelect(tick,SELECT_BY_TICKET))
         {
            ticknum++; Sleep(2000);
         }
      }
   }
   return(0);
}
//============================================================================================================
// Функция округления и нормализации ценовых значений
//============================================================================================================
double NR(double nrd) { return(NormalizeDouble(MathRound(nrd/pnt)*pnt,Digits)); }
//============================================================================================================
// Функция округления и нормализации лотов
//============================================================================================================
double NRL(double l) { if(l<MinLots) return(MinLots); else if(l>MaxLots) return(MaxLots); else return(NormalizeDouble(l,DigLots)); }
//============================================================================================================
void ZZ()
{
   int i,bs;
   double zz,H,L,w;

   for(H=0,L=0,i=0;i<Bars && (H==0 || L==0);i++)
   {
      zz=iCustom(NULL,0,"ZigZag",ZZ_ExtDepth,ZZ_ExtDeviation,ZZ_ExtBackstep,0,i);
      if(H==0 && zz==High[i])
      {
         H=NR(zz);
         if(L>0)
         {
            w=H-L;
            if(lft<Time[i]) AllDelete();
            lft=Time[i];
            BS=OP_BUY; ss=false;
            ur=NR(H-w*OpenLevelPercent/100.0+SPR*Point);
            tp=NR(H-w*TakeProfitPercent/100.0);
            sl=NR(H-w*StopLossPercent/100.0);
            if(sl>ur-(STP+SPR)*Point) sl=NR(ur-(STP+SPR)*Point);
            if(tp<ur+(STP-SPR)*Point) tp=NR(ur+(STP-SPR)*Point);
         }
      }else
      if(L==0 && zz==Low[i])
      {
         L=NR(zz);
         if(H>0)
         {
            w=H-L;
            if(lft<Time[i]) AllDelete();
            lft=Time[i];
            BS=OP_SELL; sb=false;
            ur=NR(L+w*OpenLevelPercent/100.0);
            tp=NR(L+w*TakeProfitPercent/100.0+SPR*Point);
            sl=NR(L+w*StopLossPercent/100.0+SPR*Point);
            if(sl<ur+(STP+SPR)*Point) sl=NR(ur+(STP+SPR)*Point);
            if(tp>ur-(STP-SPR)*Point) tp=NR(ur-(STP-SPR)*Point);
         }
      }
   }
   return;
}
void AllDelete()
{
   int i;

   for(i=OrdersTotal()-1;i>=0;i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;
      if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC || OrderType()<=OP_SELL) continue;
      OrderDelete(OrderTicket());
   }
   return;
}
 


Cкрипт open fiboorder

Файлы:
 
С помощью icustom бери 0 и 1 буфер зиг зага. Нулевой обозначает верхние точки, 1 - нижние точки. тебе нужно 2 последние поэтому делаешь цикл for и перебираешь все бары подряд начиная с 0 пока не наткнешься на значение зиг зага неравному 0, это и будет точка, также делаешь для низа. фибоуровни строить можно но чисто для глаз. рачитываешь же по формулам типа MathAbs(HighZigZag-LowZigZag)*0.682 - расстояние до уровня 0.682 фибо.
 
Sys15975382:
С помощью icustom бери 0 и 1 буфер зиг зага. Нулевой обозначает верхние точки, 1 - нижние точки. тебе нужно 2 последние поэтому делаешь цикл for и перебираешь все бары подряд начиная с 0 пока не наткнешься на значение зиг зага неравному 0, это и будет точка, также делаешь для низа. фибоуровни строить можно но чисто для глаз. рачитываешь же по формулам типа MathAbs(HighZigZag-LowZigZag)*0.682 - расстояние до уровня 0.682 фибо.

Спасибо, но сам буду разбираться долгие годы...
Причина обращения: