Andrju81
Андрей

 
Уровень 18

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Добавить в советник условие на выставление ордеров от пользовательского индикатора ASCtrend...

Здравствуйте, уважаемые разработчики!
Нужна Ваша помощь в добавлении(доработке) в советник условия на выставление ордеров от пользовательского стрелочного индикатора ASCtrend.
Сам недавно начал изучать язык программирования mql4, но с добавлением стрелочного индикатора себе весь мозг вынес!?..
Код советника легко читаем, так что проблем у знающих возникнуть не должно. Работа с отложенными ордерами по фракталам.
Дело в том, что советник открывает и модифицирует ордера по каждому новому фракталу. Надо сделать так, чтобы он открывал и
модифицировал ордера только при появлении сигналов от индикатора ASCtrend, т.е. при появлении сигнала от индикатора ASCtrend на покупку, советник должен открыть или модифицировать отложенный ордер SellStop на ближайший фрактал, тоже самое и для ордеров на покупку — при появлении сигнала от индикатора ASCtrend на продажу, советник должен открыть или модифицировать отложенный ордер BuyStop на ближайший фрактал. Для примера прилагаю скриншот:
Также не мешало бы изменить в нем TrailingStop от уровня безубытка, но это не столь важно.
Думаю, если посмотрите на его работу, сразу поймете что к чему!?..
Буду премного благодарен за помощь!

ASCtrend.mq4 (5 Kb)
Andrju81.mq4 (30 Kb)
  • +1
  • Просмотров: 9166
  • 17 января 2015, 00:05
  • Andrju81
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Советник помощник - Грид -
Следующая запись в группе  
Прошу создать в помощь 2 скрипта
16 января 2015
17 января 2015

Брокер для ваших роботов, 15 лет на рынке

Комментарии (19)

+
0
Пока нет сигнала, его значение в окне: 2147383647.0
Когда сигнал появляется, его значение скажем 1.190237 как на скрине.
Значит наличие сигнала можем проверять не с помощью условия if(f_up>0) а if(f_up<2)



Проверить мое предположение не удалось, т.к. чужой код для меня темный лес
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 17 января 2015, 03:36
+
0
Уважаемый, АМ2, в моем советнике условие if(f_up>0) это появление нового фрактала MODE_UPPER, т.е. если появился новый фрактал (Fractal UP), то советник, если нет выставленных отложенных ордеров на покупку, выставляет отложенный ордер BuyStop на уровень Fractal UP, если есть выставленный BuyStop, то он просто переставляет его на новое значение Fractal UP.
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 17 января 2015, 14:42
+
0
Тогда почему у вас не получается установить таким же образом ордер при появлении желтой или синей точки индикатора ASCTrend?
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 17 января 2015, 15:00
+
0
А вот с этим как раз и возникла головная боль, все перепробовал в чем смог разобраться!?.. Новичок-самоучка!!! Поэтому и обращаюсь за помощью, так как не хватает опыта!?..
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 17 января 2015, 15:11
+
0
В чем именно загвоздка? Я в своем коде получаю значения индикатора

double ASCBuy=iCustom(Symbol(),0,"ASCtrend",1,1);
double ASCSell=iCustom(Symbol(),0,"ASCtrend",0,1);


При появлении точки, выставляю ордер на расстоянии от цены:

if(ASCBuy<2 && b<1)
    {   
     price=ASCBuy+Delta*Point;
     res=OrderSend(Symbol(),OP_BUYSTOP,Lots,fND(price),3,fND(price-StopLoss*Point),fND(price+TakeProfit*Point),"",MAGIC,expiration,Blue);
    }             


Что вам мешает сделать, подобным образом?
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 17 января 2015, 15:18
+
0
Дело в том, что значение price надо сделать равным значению ближайшего Fractal UP!?.. Я пробовал искать, но почему-то условие не выполняется!?..
Вот часть кода советника, отвечающая за открытие и модификацию ордеров на покупку с комментариями:

//--------------------------------------------------------------------- Для покупки
       double ASCBuy=iCustom(Symbol(),0,"ASCtrend",1,1);
       f_up=iFractals(EASymbol,EATimeFrame,MODE_UPPER,3);
       if(f_up>0 && ASCBuy<2)                                                          //---Если открылся фрактал
         {
          if(BuyOrdersTotal()>0 || BuyStopOrdersTotal()>0)                 //---Если есть открытые/отложенные орера на покупку
            {
             for(i=0;i<OrdersTotal();i++)                                  //---Обрабатываем все открытые/отложенные ордера на покупку
               {
                if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic)               //---Выбираем ордер
                  {
                   if(OrderType()==OP_BUY && BuyStopOrdersTotal()==0 && BuyOrdersTotal()<=MaxOpenOrders-1)      //---Если ордер открыт и нет отложек
                     {
                      if(LastBuyOrderOpenPrice()>(f_up+OrderDistance*MarketInfo(EASymbol,MODE_POINT)))  //---Проверяем расстояние от цены последнего ордера до фрактала
                        {
                         if(MarketInfo(EASymbol,MODE_ASK)<(f_up-PriceDistance*MarketInfo(EASymbol,MODE_POINT)))                   //---Проверяем расстояние от цены до фрактала
                           {
                            if(Martin) lot=NormalizeDouble(LastBuyOrderLot()*MP,2); 
                            else if(MM>0) lot=MMLot(); else lot=Lot;          //---Рассчитываем lot
                            if(SetBuyStop(f_up,lot,0)) 
                              {
                               tp=BuyOrderLossLess();
                               if(tp==f_up) tp=NormalizeDouble(f_up+TPb*MarketInfo(EASymbol,MODE_POINT),MarketInfo(EASymbol,MODE_DIGITS)); else tp=tp+TPLossLess*MarketInfo(EASymbol,MODE_POINT);
                               SetBuyOrderTakeProfit(tp);
                               break;                 
                              }
                           }
                        }
                     }
                   if(OrderType()==OP_BUYSTOP)                             //---Если отложка не открылась
                     {
                      if(f_up>(MarketInfo(EASymbol,MODE_ASK)+PriceDistance*MarketInfo(EASymbol,MODE_POINT)) && f_up<(OrderOpenPrice()+OrderDistance*MarketInfo(EASymbol,MODE_POINT)))   //---Проверка расстояния от цены до фрактала и между ордерами
                        {
                         if(OrderModify(OrderTicket(),f_up,OrderStopLoss(),0,0))
                           {
                            tp=BuyOrderLossLess();
                            if(tp==f_up) tp=NormalizeDouble(f_up+TPb*MarketInfo(EASymbol,MODE_POINT),MarketInfo(EASymbol,MODE_DIGITS)); else tp=tp+TPLossLess*MarketInfo(EASymbol,MODE_POINT);
                            SetBuyOrderTakeProfit(tp);
                           }
                         else Print("BUYSTOP OrderModify error #",GetLastError());
                        }
                     }
                  }                  
               }
            }
          if(BuyOrdersTotal()==0 && BuyStopOrdersTotal()==0)         //---Если нет открытых/отложенных ордеров
            {
             if(MarketInfo(EASymbol,MODE_ASK)<(f_up-PriceDistance*MarketInfo(EASymbol,MODE_POINT)))
               {
                if(MM>0) lot=MMLot(); else lot=Lot;
                tp=NormalizeDouble(f_up+TPb*MarketInfo(EASymbol,MODE_POINT),MarketInfo(EASymbol,MODE_DIGITS));
                if(SetBuyStop(f_up,lot,0))
                  {
                   SetBuyOrderTakeProfit(tp);
                  }
               }
            }
         }

в этом случае ордера будут выставляться только если появляются сигналы от индикатора ASCtrend и фрактал на третьем баре от текущей цены, а мне надо, чтобы поиск ближайшего фрактала начинался с первого или второго бара, пока не найдется подходящий!?.. Как это лучше сделать?!..
Редактирован: 17 января 2015, 16:46
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 17 января 2015, 15:25
+
0
Может быть лучше в функции экстремумы считать а не через iFractals. Зигзаг хорошо возвращает значения вершинок своих:


/+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает экстремум ЗигЗага по его номеру.                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 17 января 2015, 21:35
+
0
Спасибо за совет, но фракталы на мой взгляд подходят лучше, тем более основой стратегии являются фракталы, а индикатор ASCtrend выступает как фильтр.
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 17 января 2015, 22:54
+
0
C помощью этой функции хорошо определяются последние фракталы:

<code>
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Поиск ближайшего фрактала. Возвращает ценовой уровень.         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy   - наименование инструмента      ("" или NULL - текущий символ)     |
//|    tf   - таймфрейм                     (    0       - текущий ТФ)         |
//|    mode - тип фрактала                  (MODE_LOWER|MODE_UPPER)            |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}
//+----------------------------------------------------------------------------+  
</code>


<code>
//+------------------------------------------------------------------+
//|                                                          ASC.mq4 |
//|                                            Copyright © 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Forex expert advisor"

//--- Inputs
extern int StopLoss      = 2000;  // стоплосс ордера
extern int TakeProfit    = 2000;  // тейкпрофит ордера
extern int Expiration    = 14;   // время истечения ордера
extern int Delta         = 100;  // расстояние от вершин
extern double Lots       = 0.1;  // объем позиции
extern int MAGIC         = 333;  // магик

double ASCBuy,ASCSell,FUP,FDN,price;
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder()
  {
   int    res,b,s;
   datetime expiration = TimeCurrent()+3600*Expiration;
    ASCBuy=iCustom(Symbol(),0,"ASCtrend",1,1);
    ASCSell=iCustom(Symbol(),0,"ASCtrend",0,1);
    FUP=iFractals(Symbol(),0,MODE_UPPER,2);
    FDN=iFractals(Symbol(),0,MODE_LOWER,2);   
      
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUYSTOP)b++;
         if(OrderType()==OP_SELLSTOP)s++; 
        }
      }
    }
    
   //--- buy
   if(ASCSell<2 && b<1)
    {   
     price=FDN+Delta*Point;
     res=OrderSend(Symbol(),OP_BUYSTOP,Lots,fND(price),3,fND(price-StopLoss*Point),fND(price+TakeProfit*Point),"",MAGIC,expiration,Blue);
    }             
                    
   //--- sell 
   if(ASCBuy<2 && s<1)
    {
     price=FUP-Delta*Point;
     res=OrderSend(Symbol(),OP_SELLSTOP,Lots,fND(price),3,fND(price+StopLoss*Point),fND(price-TakeProfit*Point),"",MAGIC,expiration,Red);
    } 
    
   Comment("\nBuy Price ",ASCBuy,"\nSell Price  ",ASCSell,
           "\nFUP ",FindNearFractal(NULL,0,MODE_UPPER),"\nFDN  ",FindNearFractal(NULL,0,MODE_LOWER));  
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
     if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
     if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());       
    }    
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Поиск ближайшего фрактала. Возвращает ценовой уровень.         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy   - наименование инструмента      ("" или NULL - текущий символ)     |
//|    tf   - таймфрейм                     (    0       - текущий ТФ)         |
//|    mode - тип фрактала                  (MODE_LOWER|MODE_UPPER)            |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}
//+----------------------------------------------------------------------------+  
//+------------------------------------------------------------------+
bool NewBar()
  {
   static datetime lastbar = 0;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
  }
//+------------------------------------------------------------------+

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()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }  
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
   
   if(CountTrades()<1)PutOrder();
   if(CountTrades()>0)DelOrder();  
//---
  }
//+------------------------------------------------------------------+

</code>

Редактирован: 19 января 2015, 19:17
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 19 января 2015, 19:11
+
0
Спасибо за функцию! Все подходит! Но тут возникла другая проблема, а именно с самим индикатором ASCtrend, в журнале алерты выдаются чаще, чем на графике, и советник получается обрабатывает только половину сигналов, а то и меньше!?.. За 2014 на 15 минутном графике EURUSD, только 15 сделок (хотя сигналов на вход значительно больше было), просадка 30%, прибыль 200%!?.. Можете глянуть сам индикатор?!.. Может что-то там подправить нужно, чтобы все сигналы отображались?!.. В терминале обновляю настройки вручную, появляются недостающие сигналы!?..
Редактирован: 19 января 2015, 20:14
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 19 января 2015, 20:11
+
0
Попробуйте этот:


//+------------------------------------------------------------------+
//|                                        ASCTrend1sig_noSound.mq4  |
//|                                       Ramdass - Conversion only  |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int RISK = 3;
extern int CountBars = 300;
//---- buffers
double val1[];
double val2[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
    //---- indicator line
    IndicatorBuffers(2);
    SetIndexStyle(0, DRAW_ARROW, 0, 1);
    SetIndexArrow(0, 234);
    SetIndexStyle(1, DRAW_ARROW, 0, 1);
    SetIndexArrow(1, 233);
    SetIndexBuffer(0, val1);
    SetIndexBuffer(1, val2);
    if(CountBars >= 1000) 
        CountBars=950;
    SetIndexDrawBegin(0, Bars - CountBars + 11 + 1);
    SetIndexDrawBegin(1, Bars - CountBars + 11 + 1);
    //----
    return(0);
  }
//+------------------------------------------------------------------+
//| ASCTrend1sig                                                     |
//+------------------------------------------------------------------+
int start()
  {
    int i, shift, counted_bars = IndicatorCounted();
    int Counter, i1, value10, value11;
    double value1, x1, x2;
    double value2, value3;
    double TrueCount, Range, AvgRange, MRO1, MRO2;
    double Table_value2[1000];
    //----
    value10 = 3 + RISK*2;
    x1 = 67 + RISK;
    x2 = 33 - RISK;
    value11 = value10;
    //----
    if(Bars <= 11 + 1) 
        return(0);
    //---- initial zero
    if(counted_bars < 11 + 1)
      {
        for(i = 1; i <= 0; i++) 
            val1[CountBars-i] = 0.0;
        for(i = 1; i <= 0; i++) 
            val2[CountBars-i] = 0.0;
      }
    //----
    shift = CountBars - 11 - 1;
    while(shift >= 0)
      {
        Counter = shift;
	       Range = 0.0;
	       AvgRange = 0.0;
	       //----
        for(Counter = shift; Counter <= shift + 9; Counter++) 
	           AvgRange=AvgRange + MathAbs(High[Counter] - Low[Counter]);
	       //----
        Range = AvgRange / 10;
	       Counter = shift;
	       TrueCount = 0;
	       //----
        while(Counter < shift + 9 && TrueCount < 1)
		        {
		          if(MathAbs(Open[Counter] - Close[Counter+1]) >= Range*2.0) 
		              TrueCount = TrueCount + 1;
		          Counter=Counter+1;
		        }
	       //----
        if(TrueCount >= 1) 
	         {
	           MRO1 = Counter;
	         } 
	       else 
	         {
	           MRO1 = -1;
	         }
	       //----
        Counter = shift;
	       TrueCount = 0;
	       //----
        while(Counter < shift + 6 && TrueCount < 1)
		        {
		          if (MathAbs(Close[Counter+3] - Close[Counter]) >= Range*4.6) 
		              TrueCount = TrueCount + 1;
		          Counter = Counter + 1;
		        }
	       //----
        if(TrueCount >= 1) 
	         {
	           MRO2 = Counter;
	         } 
	       else 
	         {
	           MRO2 = -1;
	         }
	       //----
        if(MRO1 > -1) 
	         {
	           value11 = 3;
	         } 
	       else 
	         {
	           value11 = value10;
	         }
	       //----
        if(MRO2 > -1) 
	         {
	           value11 = 4;
	         } 
	       else 
	         {
	           value11 = value10;
	         }
	       //----
        value2 = 100 - MathAbs(iWPR(NULL, 0, value11, shift)); // PercentR(value11=9)
	       Table_value2[shift] = value2;
	       val1[shift] = 0;
	       val2[shift] = 0;
	       value3 = 0;
	       //----
        if(value2 < x2)
		        {
		          i1 = 1;
		          while(Table_value2[shift + i1] >= x2 && Table_value2[shift+i1] <= x1)
		            {
		              i1++;
		            }
		          //----
            if(Table_value2[shift+i1] > x1) 
			           {
			             value3 = High[shift] + Range*0.5;
			             val1[shift] = value3;
			           } 
		        }
	       if(value2 > x1)
		        {
		          i1=1;
		          while(Table_value2[shift+i1] >= x2 && Table_value2[shift+i1] <= x1)
		            {
		              i1++;
		            }
		          if(Table_value2[shift+i1] < x2) 
			           {
			             value3 = Low[shift] - Range*0.5;
			             val2[shift] = value3;
			           }
		        }
      
        shift--;
      }
    return(0);
  }
//+------------------------------------------------------------------+



avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 19 января 2015, 20:29
+
0
Спасибо, но этот не подходит, так как перерисовывается!?.. А мой никак полечить нельзя?!..
Редактирован: 19 января 2015, 21:41
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 19 января 2015, 21:36
+
0
Уменьшил параметр RISK до 1 в индикаторе и в моем советнике количество сделок с начала 14-го 217 при стопах 500 и 200 на М15.
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 19 января 2015, 21:57
+
0
С этим я согласен! Но с таким риском, много ложных сигналов, самый оптимальный RISK 3. В ручную замечательно получается, но приходиться обновлять свойства индикатора самому, чтобы не пропустить сигналы!?..
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 19 января 2015, 22:09
+
0
AM2, можно узнать, как Вы вывели значения индикатора до и во время сигнала в окно терминала?!..
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 21 января 2015, 16:25
+
0
Коментом или в журнал принтом выводите:


Comment("\nBuy Price ",ASCBuy,"\nSell Price  ",ASCSell,
           "\nFUP ",FindNearFractal(NULL,0,MODE_UPPER),"\nFDN  ",FindNearFractal(NULL,0,MODE_LOWER));  
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 21 января 2015, 22:13
+
0
А поточнее можно, куда именно коммент прописывать в индикаторе, к примеру в этом:
#property link "http://www.forex-instruments.info"
//+------------------------------------------------------------------+
//|                                                     ASCtrend.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 DeepSkyBlue

extern int RISK = 3;
extern int AllBars = 250;
int up = 0, dn = 0;
double val1buffer[];
double val2buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
      SetIndexStyle(0,DRAW_ARROW,EMPTY,2,clrYellow);
      SetIndexArrow(0,108);
      SetIndexBuffer(0, val1buffer);

      SetIndexStyle(1,DRAW_ARROW,EMPTY,2,clrDeepSkyBlue);
      SetIndexArrow(1,108);
      SetIndexBuffer(1, val2buffer);
      return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
// int    counted_bars=IndicatorCounted();

int start()
{   
   
   double value2;
   double value3;
   double value10 = 10;
   double value11;
   double x1 = 70;
   double x2 = 30;
   int TrueCount;
   int counter;
   int MRO1;
   int MRO2;
   int i1;
   double Range;
   double AvgRange;
   double val1;
   double val2;
   double Table_value2[500][2];
   int counted_bars = IndicatorCounted();
   
   value10 = 3 + RISK * 2;
   x1 = 67 + RISK;
   x2 = 33 - RISK;
   value11 = value10;
  //---------------------------- 
    
   if(counted_bars < 0) return (-1);
   if(counted_bars > 0) counted_bars--;       //last bar recounted
   int i;
   int shift = Bars - counted_bars -1;
   if (shift > AllBars) shift = AllBars;
         
   if (shift < AllBars) shift = AllBars;
         
  for(i = shift; i > 0; i--)
   {
      counter = i;
      Range = 0;
      AvgRange = 0;
      for (counter = i; counter <= i + 9; counter++)
         {
          AvgRange = AvgRange + MathAbs( High[counter] - Low[counter] );
         }
      Range = AvgRange /10;
      
      
      counter = i;
      TrueCount = 0;
      while ( counter < i+9 && TrueCount < 1 )
         {
          if (MathAbs(Open[counter] - Close[counter + 1]) >= Range*2.0 )
          TrueCount++;
          counter++;
         }

      if (TrueCount >= 1) 
            MRO1 = counter ; 
      else 
            MRO1 = -1;
            
      counter = i;
      TrueCount = 0;
      while (counter<i+6 && TrueCount<1)
         {
          if (MathAbs(Close[counter + 3] - Close[counter]) >= Range*4.6)
             {
              TrueCount++;
             }
             counter++;
         }
      
      if(TrueCount >= 1) 
            MRO2 = counter; 
      else 
            MRO2 = -1;
            
      if (MRO1 > -1) 
            value11 = 3; 
      else 
            value11 = value10;
            
      if (MRO2 > -1) 
            value11 = 4; 
      else 
           value11 = value10;
          
            
      value2 = 100 - MathAbs(iWPR(NULL,0,value11,i));
      Table_value2[i][0] = i;
      Table_value2[i][1] = value2;
      val1 = 0;
      val2 = 0;
      value3 = 0;
      //-------------------     val1  
      if (value2<x2 )  //  x2 = 30
         {
          i1=1;
          while (Table_value2[i+i1][1]>=x2 && Table_value2[i+i1][1]<=x1)
            {
             i1++;
            }

          if (Table_value2[i+i1][1]>x1)
            {
             value3=High[i]+Range*0.5;
             val1=value3;
            }
         }
      
      //-------------------     val2  
      if ( value2 > x1) // x1 = 70 
         {  
          i1 = 1;
          while ( Table_value2[i+i1][1] >= x2 && Table_value2[i+i1][1] <= x1)
            {
             i1++;
            }
            
          if (Table_value2[i+i1][1] < x2)
            {
             value3 = Low[i] - Range * 0.5;
             val2 = value3;
            } 
         }
      
      
       
     
      if (val2!= 0 && up == 0 )
         {     
          val1buffer[i] = val2 - 1 * Point;
          up=1;
          dn=0;
          if(shift <= 2)
            {
             Alert ( Symbol(), " ", Period(), "M  Asctrend BUY ",Ask);
            }
         }  
         
      if (val1 !=0 && dn == 0)
         {
          val2buffer [i] = val1 + 1 * Point;
          dn = 1;
          up = 0;
          if(shift <= 2)
            {
             Alert (Symbol(), " ", Period(), "M   Asctrend SELL ",Bid);
            }
         }
   
    }
return (0);

}
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 21 января 2015, 23:01
+
0
Предположение оказалось верным т.к. мой простой советник торгует по сигналам индикатора.




//+------------------------------------------------------------------+
//|                                                          ASC.mq4 |
//|                                            Copyright © 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Forex expert advisor"

//--- Inputs
extern int StopLoss      = 2000;  // стоплосс ордера
extern int TakeProfit    = 2000;  // тейкпрофит ордера
extern int Expiration    = 14;   // время истечения ордера
extern int Delta         = 100;  // расстояние от вершин
extern double Lots       = 0.1;  // объем позиции
extern int MAGIC         = 333;  // магик
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder()
  {
   int    res,b,s;
   datetime expiration = TimeCurrent()+3600*Expiration;
   double ASCBuy=iCustom(Symbol(),0,"ASCtrend",1,1);
   double ASCSell=iCustom(Symbol(),0,"ASCtrend",0,1);
   double price;
      
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUYSTOP)b++;
         if(OrderType()==OP_SELLSTOP)s++; 
        }
      }
    }
    
   //--- buy
   if(ASCBuy<2 && b<1)
    {   
     price=ASCBuy+Delta*Point;
     res=OrderSend(Symbol(),OP_BUYSTOP,Lots,fND(price),3,fND(price-StopLoss*Point),fND(price+TakeProfit*Point),"",MAGIC,expiration,Blue);
    }             
                    
   //--- sell 
   if(ASCSell<2 && s<1)
    {
     price=ASCSell-Delta*Point;
     res=OrderSend(Symbol(),OP_SELLSTOP,Lots,fND(price),3,fND(price+StopLoss*Point),fND(price-TakeProfit*Point),"",MAGIC,expiration,Red);
    } 
    
   Comment("\nBuy Price ",ASCBuy,"\nSell Price  ",ASCSell);  
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
     if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
     if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());       
    }    
  }
//+------------------------------------------------------------------+
bool NewBar()
  {
   static datetime lastbar = 0;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
  }
//+------------------------------------------------------------------+

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()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }  
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
   
   if(CountTrades()<1)PutOrder();
   if(CountTrades()>0)DelOrder();  
//---
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 17 января 2015, 04:01
+
0
Индикатор вылечили, при этом скорость тестирования в разы уменьшилась, но это не столь важно!?.. Есть еще один вопрос!?.. Как лучше сделать возвращаемый TakeProfit (безубыток) после того, как время отложенного ордера истекло?!.. В моем советнике, то срабатывает, то не срабатывает!?.. Вот часть кода который я ставлю в самом конце анализа:
<code>//--------------------------------------------------- Обработка изменения баланса
   if(CurrentAccountBalance!=AccountBalance())
      {
       CurrentAccountBalance=AccountBalance();

       if((BuyOrdersTotal()!=0 && BuyStopOrdersTotal()!=1) || (BuyOrdersTotal()!=1 && BuyStopOrdersTotal()!=0))
         {
          tp=BuyOrderLossLess()+TPLossLess*MarketInfo(EASymbol,MODE_POINT);//TakeProfit равен безубыток плюс желаемое количество пунктов
          SetBuyOrderTakeProfit(tp);
         }

       if((SellOrdersTotal()!=0 && SellStopOrdersTotal()!=1) || (SellOrdersTotal()!=1 && SellStopOrdersTotal()!=0))
         {
          tp=SellOrderLossLess()-TPLossLess*MarketInfo(EASymbol,MODE_POINT);//TakeProfit равен безубыток плюс желаемое количество пунктов
          SetSellOrderTakeProfit(tp);
         }
      }</code>

Поправьте, если я где-то или как-то ошибаюсь!?..
Редактирован: 20 января 2015, 15:51
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 20 января 2015, 15:25

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий