0
Кстати вот он: www.opentraders.ru/downloads/809/
И топик незабываемый :)  zakaz.opentraders.ru/26593.html
avatar

AM2

  • 30 июня 2016, 22:33
0
Я сейчас бросил на график стандартные машки, они полностью совпали с индикатором. Это будет советник по пересечению МА, а мы уже делали такой с 3-мя машками.
avatar

AM2

  • 30 июня 2016, 22:28
0
Еще у разных брокеров эта функция может не работать, я тестирую на альпах.


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Last()
  {
   int result=0;
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderProfit()>0)
           {
            result=1;//tp  
           }
         if(OrderProfit()<0)
           {
            result=2;//sl  
           }
        }
     }
   return(result);
  }
avatar

AM2

  • 30 июня 2016, 19:35
0
Я сегодня на другом компе запустил сов из последнего поста с кодом и получил картинку которую скидывал, в базе он же. Смотрите внимательно.
avatar

AM2

  • 30 июня 2016, 19:32
0
2 раза проверял.
avatar

AM2

  • 30 июня 2016, 17:42
0
Здесь хотя бы примерный ориентир.
avatar

AM2

  • 30 июня 2016, 13:40
0
Свежий тест:

avatar

AM2

  • 30 июня 2016, 13:38
0
Код выше как раз переделанный. Вот скинул в базу: www.opentraders.ru/downloads/1223/

avatar

AM2

  • 30 июня 2016, 13:36
0
После тейка все нормально, только после стопа замолкает.

avatar

AM2

  • 30 июня 2016, 08:49
0
Имея буфер DRAW_ARROW лишнее создавать отдельно объект OBJ_ARROW, так как буфер сам создаст этот объект.
Зачем обращаться к iFractals, если потом сам по логике ищешь? И у iFractals чуть-чуть логика другая.

Наоборот помощь нужна, свежий взгляд со стороны.
У меня в коде буферы для вывода фракталов на экран. Точки отрисовываются объектами и затем удаляются, когда фрактал сформированный.
Я заметил глюк бывает когда 2 объекта рядом вылезают, один удаляется а другой остается, но это опять нужно сидеть и репу чесать как его убрать и неизвестно сколько это времени займет.
avatar

AM2

  • 30 июня 2016, 08:12
0
Бесплатное выполнение заказа согласно условиям: zakaz.opentraders.ru/25597.html
avatar

AM2

  • 30 июня 2016, 08:03
0
Можно будет что нибудь придумать, но у меня нет вообще сколько нибудь внятного ТЗ, где входы где выходы? Мне чтобы начать нужно четко все представлять. Что за серия, что за переворот, вообще ничего непонятно.
avatar

AM2

  • 29 июня 2016, 20:27
0
Вот в этом варианте после стопа тишина :) 


//+------------------------------------------------------------------+
//|                                                   OpenOrders.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots      = 0.2;      // лот
extern int StopLoss     = 500;      // лось
extern int TakeProfit   = 400;      // язь
extern int BULevel      = 200;      // уровень БУ
extern int BUPoint      = 150;      // пункты БУ
extern int TrailingStop = 0;        // трал
extern int Delta        = 75;       // расстояние от цены
extern int Expiration   = 10000;    // истечение ордера
extern int StopLimit    = 1;        // 0-Stop 1-Limit
extern int Slip         = 30;       // реквот
extern int Magic        = 123;      // магик

bool trade=true;
datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)   sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)   sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expiration*3600,clr);
   return;
  }
//+------------------------------------------------------------------+
//| 
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*Point)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if((OrderOpenPrice()-Ask)>TrailingStop*Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*Point)) || (OrderStopLoss()==0))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BU()
  {
   bool m;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderOpenPrice()<=(Bid-(BULevel+BUPoint)*Point) && OrderOpenPrice()>OrderStopLoss())
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()>=(Ask+(BULevel+BUPoint)*Point) && (OrderOpenPrice()<OrderStopLoss() || OrderStopLoss()==0))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+ 
//|                                                                   |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Last()
  {
   int result=0;
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderProfit()>0)
           {
            result=1;//tp  
           }
         if(OrderProfit()<0)
           {
            result=2;//sl  
           }
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void ClosePos(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(BULevel>0) BU();
   if(TrailingStop>0) Trailing();
   
   if(CountTrades()<1 && trade)
     {
      if(StopLimit==0)
        {
         if(CountOrders(4)<1)PutOrder(4,Bid+Delta*Point);
         if(CountOrders(5)<1)PutOrder(5,Bid-Delta*Point);
        }

      if(StopLimit==1)
        {
         if(CountOrders(2)<1)PutOrder(2,Bid-Delta*Point);
         if(CountOrders(3)<1)PutOrder(3,Bid+Delta*Point);
        }
     }

   if(Last()==2) trade=false;
   if(Last()==1) ClosePos(-1);
   if(Last()==1 || Last()==2) DelOrder();
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 29 июня 2016, 19:14
0
А давай ка спросим на форуме, мы люди не гордые, вроде бы все правильно написал :) 
Совсем ведь немного осталось доделать.
forum.mql4.com/ru/73047
avatar

AM2

  • 29 июня 2016, 14:53
0
Без пропадания самый первый вариант. Что самое интересное первые 4-5 раз нормально срабатывает а потом косячит.
avatar

AM2

  • 29 июня 2016, 10:34
0
Последний вариант ближе к ТЗ. Что можно было быстро сделать сделал.



//+------------------------------------------------------------------+
//|                                                FractalPoints.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_width1 2
#property indicator_color2 Blue
#property indicator_width2 2
//---- buffers
double up[];
double dn[];

datetime t=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,217);
   SetIndexBuffer(0,up);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,218);
   SetIndexBuffer(1,dn);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutArrow(string name,double price,int code,color clr)
  {
   ObjectCreate(0,name,OBJ_ARROW,0,Time[2],price);
//--- установим код стрелки
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,code);
//--- установим цвет стрелки
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим размер стрелки
   ObjectSetInteger(0,name,OBJPROP_WIDTH,2);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void del()
  {
   if(ObjectName(ObjectsTotal()-1)=="UP"+(string)Time[3] || ObjectName(ObjectsTotal()-1)=="DN"+(string)Time[3])
      ObjectDelete(0,ObjectName(ObjectsTotal()-1));

  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=rates_total-prev_calculated;

   for(int i=2;i<555;i++)
     {
      up[i]=iFractals(NULL,0,MODE_UPPER,i);
      dn[i]=iFractals(NULL,0,MODE_LOWER,i);
     }

   double upf=iFractals(NULL,0,MODE_UPPER,2);
   double dnf=iFractals(NULL,0,MODE_LOWER,2);
   if(upf!=0) PutArrow("UP"+(string)Time[0],High[2],108,Blue);
   if(dnf!=0) PutArrow("DN"+(string)Time[0],Low[2],108,Red);

   if(t!=Time[0])
     {
      if(High[3]>High[2] && High[3]>High[1] && High[3]>High[4] && High[3]>High[5]) ObjectDelete(0,ObjectName(ObjectsTotal()-1));
      if(Low[3]<Low[2] && Low[3]<Low[1] && Low[3]<Low[4] && Low[3]<Low[5]) ObjectDelete(0,ObjectName(ObjectsTotal()-1));
      t=Time[0];
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
avatar

AM2

  • 29 июня 2016, 10:20
0
Пока не придумал правильный алгоритм, как будет программно сделать уже проще.
avatar

AM2

  • 29 июня 2016, 09:52
0
Тут сперва надо отыскать полный аналог встроенного, раз с открытым кодом глючный, а потом уже пытаться чего мастерить. Не?

Я просто беру сигнал с встроенного и по формуле пытаюсь удалять лишние кружочки.
avatar

AM2

  • 29 июня 2016, 09:45