Система "Price Action Scalper" можно ли так торговать?
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Система довольно простая.



Чтобы ответить на вопрос протестируйте систему.


//+------------------------------------------------------------------+
//|                                           PriceActionScalper.mq4 |
//|                                            Copyright © 2011, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, AM2"
#property link      "http://www.forexsystems.biz"

#define MAGIC  20120225

extern double StopLoss=450;
extern double TakeProfit=800;
extern int HourOn=9; 
extern int HourOff=21;

extern double Lots=0.1;


//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
                      
   int    res;
   double OpenH1,OpenM30,OpenM15,OpenM5,
          CloseH1,CloseM30,CloseM15,CloseM5;
          
   OpenH1=iOpen(Symbol(),PERIOD_H1,1);
   OpenM30=iOpen(Symbol(),PERIOD_M30,1);
   OpenM15=iOpen(Symbol(),PERIOD_M15,1);
   OpenM5= iOpen(Symbol(),PERIOD_M5,1);

   CloseH1=iClose(Symbol(),PERIOD_H1,1);
   CloseM30=iClose(Symbol(),PERIOD_M30,1);
   CloseM15=iClose(Symbol(),PERIOD_M15,1);
   CloseM5=iClose(Symbol(),PERIOD_M5,1);

//---- buy conditions
   if(Hour()>=HourOn && Hour()<HourOff && (CloseH1-OpenH1)>0 && (CloseM30-OpenM30)>0 && (CloseM15-OpenM15)>0 && (CloseM5-OpenM5)>0)  
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MAGIC,0,Blue);
      return;
     }   
//---- sell conditions
   if(Hour()>=HourOn && Hour()<HourOff && (CloseH1-OpenH1)<0 && (CloseM30-OpenM30)<0 && (CloseM15-OpenM15)<0 && (CloseM5-OpenM5)<0)  
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MAGIC,0,Red);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(OrdersTotal()<1) CheckForOpen();                                 
//----
  }
//+----------------------------------------------------------------------------+

Советник торгующий по "Волнам Вульфа".
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Вот это видео вдохновило меня на написание эксперта. Что из этого получилось вы можете посмотреть в конце материала.

Описание стратегии

Как ни странно, в основе данной стратегии лежит первый закон Ньютона, в котором говориться о том, что для каждого действия есть силы противодействия. Исходя из данного закона физики, Билл Вульф сделал вывод, что цены на финансовых рынках движутся подобно волнам в океане.

Данная стратеги очень проста для понимания, Вам необходимо лишь запомнить несколько правил для построения волн, но для начала взгляните на рисунок ниже, который всё расставит на свои места.

Бычья и медвежья модели разворота



Как видно из рисунка, суть данной стратегии состоит в поиске вершин по заданным параметрам, построении линий через их вершины, и определении точек входа и выхода на основе построенных линий. Каждая вершина на рисунке имеет свой персональный смысл.

Описание бычьей (восходящей) модели разворота

Поиск точек

Точка 1 – основание первой волны (точка минимума первой волны). Точка 1 должна быть выше точки 3 и ниже точки 2 и 4. (смотрите рисунок выше)

Точка 2 – вершина первой волны (точка максимума первой волны) и основание второй волны. На её основе строятся все остальные точки. Это главная точка.

Точка 3 – одновременно точка окончания второй волны и начала третьей (основание третьей, вершина второй)

Точка 4 – вершина волны 3 и основание волны 4.

Точка 5 – точка разворота. Ради её поиска производиться построение волн на основе точек 1,2,3 и 4. Именно в этой точке происходит вход на рынок.

Точка 6 – Точка выхода из рынка (EPA (Estimated Price at Arrival)). Точка 6 определяется в результате построения линии через точки 1 и 4.

Формирование волн

Волна 1 – образуется точками 1 и 2.

Волна 2 – образуется точками 2 и 3.

Волна 3 – образуется точками 3 и 4.

Волна 4 – образуется точками 4 и 5. В конце волны 4 происходит вход на рынок.

Волна 5 – мнимая волна, с началом в точке 5 и с вершиной в точке 6.

(!) Медвежья модель разворота строится по аналогии бычьей модели и является её зеркальным отражением.

Помимо линии, проведенной через точки 1 и 4 для нахождения точки 6 (EPA), необходимо провести еще 2 линии. Первая через точки 1,3 и 5, вторая через точки 2 и 4. Точка пересечения этих двух линий образует точку ЕТА (Estimated Time of Arrival), которая является целью по времени, то есть после этой точки желательно закрыть открытую позиции. Если же точка ЕТА находиться после точки 6 (EPA), то её (точку EPA) можно не брать в расчет. Если же точка ЕТА находиться до точки EPA, то рекомендуется не дожидаться пока цена дойдет до точки 6 (EPA) и закрыть позиции в точке ЕТА.

Если точка ЕТА не может быть образована (например, если точка 4 выше точки 2), желательно воздержаться от входа в точке 5.

Далее мы рассмотрим несколько примеров применения стратегии Волны Вульфа на графике валютной пары GBP/USD H4.

Примеры использования



В данном примере мы детально рассмотрим процесс формирования волн Вульфа. Для анализа был взят 4-х часовой график GBP/USD.

Выделяем точки 1,2,3,4, строим трендовые линии через точки 1, 3 и точки 2, 4. Далее ждем подтверждения окончания формирования волны 4.



Подтверждение образования 4 волны получено. Ждем появления точки разворота 4-ой волны.



Наблюдаем разворот в конце волны 4, как мы и ожидали. Исходя из проведенной нами линии через точки 1 и 3, мы ищем точку 5.



Поиск точки входа (точка 5) производиться при помощи построения проекции на основании точки 2 и 3.



При открытии позиции в точке 5, рекомендуется поставить стоп-лосс, равный длине проекции точки 3 на точку 5.

Далее определяем цель, проводим линию EPA.



Если у вас возникли проблемы с поиском точки 4, которая необходима для определения цели, то Вы можете провести несколько альтернативных линий EPA, с небольшим отклонением в обе стороны от точки 4. В любом случае, рекомендуется не завышать линию EPA.

Получена новая линия EPA. Исходя из новой линии EPA можно еще некоторое время подержать ордер открытым, или же закрыть его на основании временной линии ETA.



В данном примере рассмотрен идеальный пример прогнозирования разворота цены на основании построения волн Вульфа. При использовании стратегии на основе волн Вульфа желательно брать временные промежутки от M5 до D1. На графиках M5-M15 можно еженедельно выделять 4-6 фигур разворота. На графиках от H1 для более точного входа желательно брать в расчет уровни поддержки и сопротивления (серые линии на графиках).

Плюсы стратегии Волны Вульфа

Не требует дополнительных инструментов тех анализа.

Простые правила на вход и выход.

Подходит как новичкам, так и профессионалам.

Минусы стратегии Волны Вульфа

Поиск точек и построение по ним волн и линий EPA и ETA является весьма субъективным занятием. Можно выделить несколько вариантов построения фигур на одном графике с разным временным промежутком, причем каждый вариант будет сигнализировать о разных и парой противоположных сигналах на вход.

Для поиска правильной точки входа необходимо воспользоваться дополнительными инструментами технического анализа. В данном случае пригодятся:

стандартный индикатор фракталов,

построение уровней поддержки и сопротивления (пивоты),

а также поиск моделей разворота на основе японских свечей.

Психологически сложно открывать и удерживать позицию против текущего тренда. К тому же при неправильно открытой позиции может сработать стоп-лосс (если, конечно же, Вы его установили), что может привести не только к финансовым потерям, но и к нежеланию открывать повторную позицию. Также на пути к точке EPA может случиться небольшой разворот, при котором многие трейдеры закрывают позиции, ничего при этом не заработав.

Выводы

Стратегия Волны Вульфа представляет интерес не только из-за своей универсальности и простоты, но из-за своей высокой доходности. За одну сделку можно снимать от 50-100 пунктов, при стоп-лоссе втрое меньше изначальной цели.

Но, как и любая другая стратегия, Волны Вульфа требует не только наличия опыта при построении фигур, но и знания дополнительных средств технического анализа.

П.С. С помощью этого простейшего кода вы сможете проверить работоспособность данной стратегии.


//+------------------------------------------------------------------+
//|                                                           WW.mq4 | 
//|                                            Copyright © 2011, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, AM2"
#property link      "http://www.forexsystems.biz"

#define MAGIC  20120225

extern double StopLoss=450;
extern double TakeProfit=800;
extern int    ExtDepth=10;
extern int    ExtDeviation=5;
extern int    ExtBackstep=3;

extern double Lots=0.1;

bool bone=true,sone=true;

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double zz1,zz2,zz3,zz4,zz5;
   int    res;

//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
   
//---- get Extremum ZigZag Price
 
   zz1=GetExtremumZZPrice(NULL,0,4,ExtDepth,ExtDeviation,ExtBackstep);
   zz2=GetExtremumZZPrice(NULL,0,3,ExtDepth,ExtDeviation,ExtBackstep);
   zz3=GetExtremumZZPrice(NULL,0,2,ExtDepth,ExtDeviation,ExtBackstep);
   zz4=GetExtremumZZPrice(NULL,0,1,ExtDepth,ExtDeviation,ExtBackstep);
   zz5=GetExtremumZZPrice(NULL,0,0,ExtDepth,ExtDeviation,ExtBackstep); 
           
   Comment("\n","ZZ1 = ",zz1,"\n",
          "ZZ2 = ",zz2,"\n",
          "ZZ3 = ",zz3,"\n",
          "ZZ4 = ",zz4,"\n",
          "ZZ5 = ",zz5,"\n");
   
//---- buy conditions
   if(zz1>zz3 && zz1<zz2 && zz1<zz4 && zz5<=zz3 && bone)  
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MAGIC,0,Blue);
      bone=false;
      sone=true;
      return;
     }   
//---- sell conditions
   if(zz1<zz3 && zz1>zz2 && zz1>zz4  && zz5>=zz3 && sone)  
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MAGIC,0,Red);
      sone=false;
      bone=true;
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(OrdersTotal()<1) CheckForOpen();                                 
//----
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+

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);
}
//+----------------------------------------------------------------------------+

Обзоры торговых систем
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Бродя по просторам рунета в поисках грааля обнаружил следующий ресурс:
«Обзоры торговых систем» на Лепреконе.
Здесь приводится обзор лишь некоторых советников.

( Читать полностью... )

Тестирование ТС. Неделя 1.
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Приветствую всех в данном топике!
С целью приобретения навыков практического трейдинга и совершенствования торговой системы буду один раз в день(вечером), совершать сделку с фиксированными значениями стопов.

Брокер InstaForex, депозит 18.67 долларов.
Валюта EURGBP, лот 0.01.
StopLoss 750 пунктов,
TakeProfit 60 пунктов

Не удержался до начала следующей недели, начну сегодня! *улыбается*

Гридеры.
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Гридер — советник, торгующий сеткой отложенных ордеров.

Идея позаимствована с сайта mql4.com.

Стратегия торговли проста как мир. Ставится ордер на покупку, либо на продажу и лочится стоп-ордером на расстоянии Delta1.

Далее набрасывается сетка из лимитных, либо стоповых ордеров на расстоянии delta один от другого. При достижении ценой профита — Profit, всё закрывается и продолжаем заново. Работаем на минутках.

Основная идея:

Если уровень ADX ниже 40, то считаем, что флет и выставляются лимитные ордеры, если выше, то стоповые;
Если DI+ выше чем DI-, то покупаем, если наоборот, то продаем.
Все линии по индикатору — ADX.

Дополнительные настройки — это klot — коэффициент на который умножается каждый следующий отложенный ордер, и pluslot — количество лотов, которое прибавляется при каждом следующем отложенном ордере.


Рис.1. Результат работы эксперта.

Код советника:


//+------------------------------------------------------------------+
//|                                           Proffessor_v1_2011.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern double lot          = 0.1;  //лот
extern int    MAX_Lines    = 5;    //максимальное колличество отложенных ордеров каждого направления  
extern double klot         = 1;    //коэффициент умножения лотов при удалении от цены  
extern double pluslot      = 0.1;  //коэффициент доливки лота при удалении от цены
extern int    plusDelta    = -5;   //коэффициент увеличения расстояния между отложенными ордерами
                                   //если значение отрицательное, то расстояние уменьшается на данное кол-во пунктов
extern double Delta1       = 70;   //первая дельта от цены для стопового ордера
extern int    Delta        = 60;   //расстояние между отложенными ордерами  
extern double ProfitClose  = 0.8;  //закрывать все ордера при получении профита(в долларах)  
extern double f            = 40;   //параметр границы флета по ADX
extern double bar          = 2;    //сдвиг по барам ADX
extern double timeframe    = 1;    //таймфрейм для индикатора ADX 0-текущий,1-1минута, 2-5минут, 3-15минут, 4-30минут, 5-1час
                                   //6-4часа, 7-день, 8-неделя, 9-месяц
extern int    magic        = 123;  //магик
extern int    StartHour    = 0;    //час начала работы советника
extern int    EndHour      = 24;   //час окончания работы советника
extern int    pop          = 3;    //количество попыток закрыть ордер
int init() {
      Comment("ProfessorSoft_v3_2011");
      return (0);
  
}

int deinit() {
      Comment("");
      return (0);
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
bool ticket;
double Lots;
int x,q;
bool trade=false;
trade=true;
double iflet,ibuy,isell;
int _timeframe;
if(timeframe==1)_timeframe=1;
else if(timeframe==0)_timeframe=0;
else if(timeframe==2)_timeframe=5;
else if(timeframe==3)_timeframe=15;
else if(timeframe==4)_timeframe=30;
else if(timeframe==5)_timeframe=60;
else if(timeframe==6)_timeframe=240;
else if(timeframe==7)_timeframe=1440;
else if(timeframe==8)_timeframe=10080;
else _timeframe=43200;

   if(OrdersTotal()==0 && trade==true && time()==true)
   {
   ticket=-1;
    iflet=iADX( Symbol(), _timeframe, 14, PRICE_CLOSE,MODE_MAIN, bar); 
    ibuy=iADX( Symbol(), _timeframe, 14, PRICE_CLOSE,MODE_PLUSDI, bar); 
    isell=iADX(  Symbol(), _timeframe, 14, PRICE_CLOSE,MODE_MINUSDI, bar); 
      
      if(iflet<f && ibuy>isell)//условие для покупки и определение флета
      {
               Lots=lot;
               ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",magic,0,Blue);
                if(ticket==-1)return(0);
               OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Delta1*Point,3,0,0,"",magic,0,Red);
       
                for(x=1;x<=MAX_Lines;x++)
               {
                Lots=NormalizeDouble(Lots*klot,2)+pluslot;
                  OrderSend(Symbol(),OP_BUYLIMIT,Lots,Ask-(Delta1+x*NormalizeDouble(Delta+plusDelta*x/2,0))*Point,3,0,0,"",magic,0,Blue);
                  OrderSend(Symbol(),OP_SELLLIMIT,Lots,Bid+x*NormalizeDouble(Delta+plusDelta*x/2,0)*Point,3,0,0,"",magic,0,Red);     
               }
      
      
      }
      else if(iflet<f && ibuy<isell)//условие для продажи и определение флета
      {
                  Lots=lot;
                  ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",magic,0,Red); 
                   if(ticket==-1)return(0);
                  OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Delta1*Point,3,0,0,"",magic,0,Blue);
                    for(x=1;x<=MAX_Lines;x++)
                  {
                     Lots=NormalizeDouble(Lots*klot,2)+pluslot;
                     OrderSend(Symbol(),OP_BUYLIMIT,Lots,Ask-x*NormalizeDouble(Delta+plusDelta*x/2,0)*Point,3,0,0,"",magic,0,Blue);
                     OrderSend(Symbol(),OP_SELLLIMIT,Lots,Bid+(Delta1+x*NormalizeDouble(Delta+plusDelta*x/2,0))*Point,3,0,0,"",magic,0,Red);     
                  }
      }
       else if(iflet>f && ibuy>isell)//условие для покупки и определение тренда
      {
                   Lots=lot;
                   ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",magic,0,Blue);
                    if(ticket==-1)return(0);
                   OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Delta1*Point,3,0,0,"",magic,0,Red);
       
                    for(x=1;x<=MAX_Lines;x++)
                   {
                    Lots=NormalizeDouble(Lots*klot,2)+pluslot;
                      OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(Delta1+x*NormalizeDouble(Delta+plusDelta*x/2,0))*Point,3,0,0,"",magic,0,Blue);
                      OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+x*NormalizeDouble(Delta+plusDelta*x/2,0)*Point,3,0,0,"",magic,0,Red);     
                   }
      }
       else if(iflet>f && ibuy<isell)//условие для продажи и определение тренда
      {
                  Lots=lot;
                  ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",magic,0,Red); 
                   if(ticket==-1)return(0);
                  OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Delta1*Point,3,0,0,"",magic,0,Blue);
                    for(x=1;x<=MAX_Lines;x++)
                  {
                     Lots=NormalizeDouble(Lots*klot,2)+pluslot;
                     OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-x*NormalizeDouble(Delta+plusDelta*x/2,0)*Point,3,0,0,"",magic,0,Blue);
                     OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(Delta1+x*NormalizeDouble(Delta+plusDelta*x/2,0))*Point,3,0,0,"",magic,0,Red);     
                  }
      }
      else return(0);
     
   }
  
  
      
      if(OrdersTotal()>0)
    {
     Comment("          Balance  ",AccountBalance(),"\n          Equity  ",AccountEquity(),"\n          Profit  ",OrdersProfit());
      if(OrdersProfit()>=ProfitClose)
      {
         for (int i=OrdersTotal()-1;i>=0;i--)
         {
            bool closed;
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
           
            if(OrderType()==OP_BUY) 
            {
                  for(q=0;q<pop;q++)
                  {
                  closed=false;
                  closed=OrderClose(OrderTicket(),OrderLots(),Bid,3,Blue);
                  if(closed==true)q=pop;
                  }
            }
           
            if(OrderType()==OP_SELL) 
            {
                  for(q=0;q<pop;q++)
                  {
                  closed=false;
                  closed=OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
                  if(closed==true)q=pop;
                  }
            }
            Sleep(1000);
            if(OrderType()>1 ) OrderDelete(OrderTicket());
         }
      }
    }
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

   bool time()
 {
   if (StartHour<EndHour) 
      {if (Hour()>=StartHour && Hour()<EndHour) return(true); else return(false);}
   if (StartHour>EndHour) 
      {if (Hour()>=EndHour && Hour()<StartHour) return(false); else return(true);}
 }
 
double OrdersProfit()
{
   
  double rezultSymb=0;
  string SMB=Symbol();
  int i;
  for (i=OrdersTotal()-1;i>=0;i--)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
     {
      if(OrderSymbol()!= SMB) continue;
      if(OrderType()==OP_BUY || OrderType()==OP_SELL)
       {
        rezultSymb+=OrderProfit();
       } 
     }
   }
  return(rezultSymb);
}


Чем вам не грааль?

Тестирование эксперта MoneyPrinter
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Суть системы в следующем:

1) В ноль-ноль по терминальному времени открывается две сделки по GBPUSD, одна на север, вторая на юг. Тейк короткий — 10-15 пп. Лот — 0,01 на 100$ депозита.
2) Дальше, одна из сделок закрывается по тейку. На втором направлении начинается усреднение. Пипстеп рассчитывается из следующих соображений:
а) исторически сложившееся максимальное бескоррекционное движение GBPUSD,
б) максимально допустимая просадка в 50% на N-ное количество колен.
На сегодня этот диапазон составляет 2-2,5 фигуры.
3) Далее, если этого расстояния оказывается недостаточно для закрытия серии, тогда срабатывает отложенный локирующий ордер и серия выводится в БУ с помощью локирующих ордеров.


Рис.1. Схема работы эксперта.



Рис.2. Результаты работы эксперта в тестере с 2009 г. GBPUSD, H1. Депо 10000$. Альпари.

 
=========== Советник участвует в Тестовой лаборатории ==============

Демо-счет (нажмите на график, чтобы увеличить):

Начало тестирования: 03.11.2011
Начальный депозит: 10 000 (на графике показан чистый прирост)
Брокер: Alpari

Текущий статус: Тест на демо-счетев процессе тестирования на демо-счете

Пишем усреднитель.
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Воспользуемся для нашего усреднителя готовой торговой системой одного из успешных управляющих на рынке FOREX.

Суть системы в следующем:

1) В ноль-ноль по терминальному времени открывается две сделки по GBPUSD, одна на север, вторая на юг. Тейк короткий — 10-15 пп. Лот — 0,01 на 100$ депозита.
2) Дальше, одна из сделок закрывается по тейку. На втором направлении начинается усреднение. Пипстеп рассчитывается из следующих соображений:
а) исторически сложившееся максимальное бескоррекционное движение GBPUSD,
б) максимально допустимая просадка в 50% на N-ное количество колен.
На сегодня этот диапазон составляет 2-2,5 фигуры.
3) Далее, если этого расстояния оказывается недостаточно для закрытия серии, тогда срабатывает отложенный локирующий ордер. Сова отключается и разруливание лока производится вручную.

За основу возьмем код эксперта Ilan 1.4.

Далее достаточно немного изменить блок сигнала для первой сделки:


      if (TradeNow && total<1){
         double PrevCl = iClose(Symbol(),0,2);
         double CurrCl = iClose(Symbol(),0,1);
         SellLimit = Bid;   
         BuyLimit = Ask;
   
            if(!ShortTrade && !LongTrade){
               NumOfTrades = total;
                  if(PrevCl > CurrCl){
                     iLots = fGetLots(OP_SELL);
                        if(iLots>0){//#
                           ticket = OpenPendingOrder(OP_SELL,iLots,SellLimit,slip,SellLimit,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,HotPink);
                           if(ticket<0){Print(iLots,"Error: ",GetLastError()); return(0);}
                           LastBuyPrice = FindLastBuyPrice();
                           NewOrdersPlaced = true;
                        }//#
                  }   
                  else{
                     iLots = fGetLots(OP_BUY);
                        if(iLots>0){//#      
                           ticket = OpenPendingOrder(OP_BUY,iLots,BuyLimit,slip,BuyLimit,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,Lime);
                              if(ticket<0){Print(iLots,"Error: ",GetLastError()); return(0);}
                                 LastSellPrice = FindLastSellPrice();
                                 NewOrdersPlaced = true;
                              }//#
                        }
                  }      
               if(ticket>0) expiration = CurTime()+MaxTradeOpenHours*60*60;
               TradeNow = false;
            }



Новый вариант у нас будет иметь вид:


      if (TradeNow && total<1){

         SellLimit = Bid;   
         BuyLimit = Ask;
   
            if(!ShortTrade && !LongTrade && Hour()==0)
            {
               NumOfTrades = total;
                  {
                     iLots = fGetLots(OP_SELL);
                        if(iLots>0){//#
                           ticket = OpenPendingOrder(OP_SELL,iLots,SellLimit,slip,SellLimit,0,Bid-TakeProfit*Point,EAName+"-"+NumOfTrades,MagicNumber,0,HotPink);
                           if(ticket<0){Print(iLots,"Error: ",GetLastError()); return(0);}
                           LastBuyPrice = FindLastBuyPrice();
                           NewOrdersPlaced = true;
                        }//#
                  }   
                        {
                     iLots = fGetLots(OP_BUY);
                        if(iLots>0){//#      
                           ticket = OpenPendingOrder(OP_BUY,iLots,BuyLimit,slip,BuyLimit,0,Ask+TakeProfit*Point,EAName+"-"+NumOfTrades,MagicNumber,0,Lime);
                              if(ticket<0){Print(iLots,"Error: ",GetLastError()); return(0);}
                                 LastSellPrice = FindLastSellPrice();
                                 NewOrdersPlaced = true;
                              }//#
                        }
                  }      
               if(ticket>0) expiration = CurTime()+MaxTradeOpenHours*60*60;
               TradeNow = false;
            }



И наш усреднитель уже может выставлять две разнонаправленные сделки в ноль часов, затем выводить в плюс убыточную сделку.



Рис.1. Схема работы усреднителя.

И вот новый код готов!


//+------------------------------------------------------------------+
//|                                   2008                   Ilan1.4 |
//+------------------------------------------------------------------+


#property copyright "Nikisaki@yandex.ru"

extern int     MMType=1; // Тип ММ: 0-Lots, 1-как было в 1.2, 2-мартингейл (коэффициент LotExponent)
extern bool    UseClose=false; // закрытие по убытку PipStep. рекомендутся false 
extern bool    UseAdd=true; // переоткрытие с новым лотом. лот для переоткрытия считается по LotExponent независимо от MMType рекомендутся = true
extern double  LotExponent = 1.667; // умножение лотов в серии по експоненте для вывода в безубыток. первый лот 0.1, серия: 0.16, 0.26, 0.43 ...
extern double  slip = 3; // допустимое проскальзывание цены в пипсах
extern double  Lots = 0.1; // теперь можно и микролоты 0.01 при этом если стоит 0.1 то следующий лот в серии будет 0.16
extern double  LotsDigits=2; // 2 - микролоты 0.01, 1 - мини лоты 0.1, 0 - нормальные лоты 1.0
extern double  TakeProfit = 10; // Уровень прибыли в пипсаз от цены открытия.
 double  Stoploss = 500; // эти три параметра не работают
 double  TrailStart = 10;
 double  TrailStop = 10;
extern double  PipStep = 30; // растоянию в пипсах убытка на котором открываеться следующий ордер колена.
extern int     MaxTrades = 10;
extern bool    UseEquityStop = false;
extern double  TotalEquityRisk = 20; //loss as a percentage of equity
extern bool    UseTrailingStop = false;
extern bool    UseTimeOut = false;
extern double  MaxTradeOpenHours = 48;

int MagicNumber = 12324;
double PriceTarget, StartEquity, BuyTarget, SellTarget;
double AveragePrice, SellLimit, BuyLimit;
double LastBuyPrice, LastSellPrice, ClosePrice, Spread;
int flag;
string EAName = "CostAvg-Pyramid";
datetime timeprev=0, expiration;
int NumOfTrades=0;
double iLots;
int cnt=0, total;
double Stopper=0;  
bool TradeNow = false, LongTrade=false, ShortTrade=false;
int ticket;
bool NewOrdersPlaced = false;

int init()
{
 Spread = MarketInfo(Symbol(), MODE_SPREAD)*Point;
 return(0);
}

int deinit()
{
 return(0);
}

int start(){

  
  
   if (UseTrailingStop){
      TrailingAlls(TrailStart, TrailStop, AveragePrice); 
   }
   if (UseTimeOut){
      if(CurTime() >= expiration){
         CloseThisSymbolAll();
         Print("Closed All due to TimeOut");
      }
   }
  
   if(timeprev==Time[0]){
      return(0);
   }
 
   timeprev=Time[0];
 
   double CurrentPairProfit = CalculateProfit();
      if(UseEquityStop){
         if(CurrentPairProfit<0 && MathAbs(CurrentPairProfit)>(TotalEquityRisk/100)*AccountEquityHigh()){
            CloseThisSymbolAll();
            Print("Closed All due to Stop Out");
            NewOrdersPlaced = false;
         }
      }

 
   total=CountTrades();
   
      if (total == 0){
         flag = 0;
      }
      
   double LastBuyLots;
   double LastSellLots;
      
      for(cnt=OrdersTotal()-1;cnt>=0;cnt--){// поиск последнего направления
         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
            if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)continue;
               if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
                  if(OrderType()==OP_BUY){
                     LongTrade = true;
                     ShortTrade = false;
                     LastBuyLots=OrderLots();
                     break;
                  }
               if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
                  if(OrderType()==OP_SELL){
                     LongTrade = false;
                     ShortTrade = true;
                     LastSellLots=OrderLots();
                     break;
               }
      }
  
      if(total>0 && total <= MaxTrades){
         RefreshRates();
         LastBuyPrice = FindLastBuyPrice();
         LastSellPrice = FindLastSellPrice();
            if(LongTrade && (LastBuyPrice - Ask) >= (PipStep*Point)){
               TradeNow = true;
            }
            if(ShortTrade && (Bid - LastSellPrice) >= (PipStep*Point)){
               TradeNow = true;
            }
      } 
  
      if (total < 1){
         ShortTrade = false;
         LongTrade = false;
         TradeNow = true;
         StartEquity = AccountEquity();
      }

      if (TradeNow){
         LastBuyPrice = FindLastBuyPrice();
         LastSellPrice = FindLastSellPrice();
            if(ShortTrade){
                  if(UseClose){
                     fOrderCloseMarket(false,true);
                     iLots = NormalizeDouble(LotExponent*LastSellLots,LotsDigits);
                  }
                  else{
                     iLots = fGetLots(OP_SELL);
                  }
                  if(UseAdd){
                     NumOfTrades = total;               
                        if(iLots>0){//#
                           RefreshRates();
                           ticket = OpenPendingOrder(OP_SELL,iLots,Bid,slip,Ask,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,HotPink);
                           if(ticket<0){Print("Error: ",GetLastError()); return(0);}
                           LastSellPrice = FindLastSellPrice();
                           TradeNow = false;
                           NewOrdersPlaced = true;
                        }//#
                  }
            }
            else if (LongTrade){   
                  if(UseClose){
                     fOrderCloseMarket(true,false);
                     iLots = NormalizeDouble(LotExponent*LastBuyLots,LotsDigits);
                  }           
                  else{
                     iLots = fGetLots(OP_BUY);
                  } 
                  if(UseAdd){
                     NumOfTrades = total;
                        if(iLots>0){//#
                           ticket = OpenPendingOrder(OP_BUY,iLots,Ask,slip,Bid,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,Lime);
                           if(ticket<0){Print("Error: ",GetLastError()); return(0);}
                           LastBuyPrice = FindLastBuyPrice();
                           TradeNow = false;
                           NewOrdersPlaced = true;
                        }//#
                  }
            }
      }
  
      if (TradeNow && total<1){

         SellLimit = Bid;   
         BuyLimit = Ask;
   
            if(!ShortTrade && !LongTrade && Hour()==0)
            {
               NumOfTrades = total;
                  {
                     iLots = fGetLots(OP_SELL);
                        if(iLots>0){//#
                           ticket = OpenPendingOrder(OP_SELL,iLots,SellLimit,slip,SellLimit,0,Bid-TakeProfit*Point,EAName+"-"+NumOfTrades,MagicNumber,0,HotPink);
                           if(ticket<0){Print(iLots,"Error: ",GetLastError()); return(0);}
                           LastBuyPrice = FindLastBuyPrice();
                           NewOrdersPlaced = true;
                        }//#
                  }   
                        {
                     iLots = fGetLots(OP_BUY);
                        if(iLots>0){//#      
                           ticket = OpenPendingOrder(OP_BUY,iLots,BuyLimit,slip,BuyLimit,0,Ask+TakeProfit*Point,EAName+"-"+NumOfTrades,MagicNumber,0,Lime);
                              if(ticket<0){Print(iLots,"Error: ",GetLastError()); return(0);}
                                 LastSellPrice = FindLastSellPrice();
                                 NewOrdersPlaced = true;
                              }//#
                        }
                  }      
               if(ticket>0) expiration = CurTime()+MaxTradeOpenHours*60*60;
               TradeNow = false;
            }

//----------------------- CALCULATE AVERAGE OPENING PRICE
   total=CountTrades();
   AveragePrice=0;
   double Count = 0;
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
     continue;
    if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
     if(OrderType()==OP_BUY || OrderType()==OP_SELL)  
      {
       AveragePrice=AveragePrice+OrderOpenPrice()*OrderLots();
       Count = Count + OrderLots();
      }
   }
   if(total > 0)
    AveragePrice=NormalizeDouble(AveragePrice/Count, Digits);

   
//----------------------- RECALCULATE STOPLOSS & PROFIT TARGET BASED ON AVERAGE OPENING PRICE
   if(NewOrdersPlaced)
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
     continue;
    if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
     if(OrderType()==OP_BUY) // Calculate profit/stop target for long 
     {
      PriceTarget=AveragePrice+(TakeProfit*Point);
      BuyTarget = PriceTarget;
      Stopper=AveragePrice-(Stoploss*Point); 
//      Stopper=0; 
      flag = 1;
     }
    if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
     if(OrderType()==OP_SELL) // Calculate profit/stop target for short
     {
      PriceTarget=AveragePrice-(TakeProfit*Point);
      SellTarget = PriceTarget;
      Stopper=AveragePrice+(Stoploss*Point);  
//      Stopper=0; 
      flag = 1; 
     }
   }
//----------------------- IF NEEDED CHANGE ALL OPEN ORDERS TO NEWLY CALCULATED PROFIT TARGET    
  if(NewOrdersPlaced)
  if(flag==1)// check if average has really changed
  {   
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
    {
//     PriceTarget=total;
     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);            
     if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
      continue;
     if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
//      OrderModify(OrderTicket(),0,Stopper,PriceTarget,0,Yellow);// set all positions to averaged levels
      OrderModify(OrderTicket(),AveragePrice,OrderStopLoss(),PriceTarget,0,Yellow);// set all positions to averaged levels
     NewOrdersPlaced = false;
    }
  }
}
double ND(double v){return(NormalizeDouble(v,Digits));}

int fOrderCloseMarket(bool aCloseBuy=true,bool aCloseSell=true){
   int tErr=0;
      for(int i=OrdersTotal()-1;i>=0;i--){
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber){
               if(OrderType()==OP_BUY && aCloseBuy){
                  RefreshRates();
                     if(!IsTradeContextBusy()){
                        if(!OrderClose(OrderTicket(),OrderLots(),ND(Bid),5,CLR_NONE)){
                           Print("Error close BUY "+OrderTicket());//+" "+fMyErDesc(GetLastError())); 
                           tErr=-1;
                        }
                     }
                     else{
                        static int lt1=0;
                           if(lt1!=iTime(NULL,0,0)){
                              lt1=iTime(NULL,0,0);
                              Print("Need close BUY "+OrderTicket()+". Trade Context Busy");
                           }            
                        return(-2);
                     }   
               }
               if(OrderType()==OP_SELL && aCloseSell){
                  RefreshRates();
                     if(!IsTradeContextBusy()){                        
                        if(!OrderClose(OrderTicket(),OrderLots(),ND(Ask),5,CLR_NONE)){
                           Print("Error close SELL "+OrderTicket());//+" "+fMyErDesc(GetLastError())); 
                           tErr=-1;
                        }  
                     }
                     else{
                        static int lt2=0;
                           if(lt2!=iTime(NULL,0,0)){
                              lt2=iTime(NULL,0,0);
                              Print("Need close SELL "+OrderTicket()+". Trade Context Busy");
                           }            
                        return(-2);
                     }          
               }
            }
         }
      }
   return(tErr);
}  


double fGetLots(int aTradeType){
   double tLots;
      switch(MMType){
         case 0:
            tLots=Lots;
         break;
         case 1:
            tLots=NormalizeDouble(Lots*MathPow(LotExponent,NumOfTrades),LotsDigits);
         break;
         case 2:
            int LastClosedTime=0;
            tLots=Lots;
               for(int i=OrdersHistoryTotal()-1;i>=0;i--){
                  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
                     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber){
                        if(LastClosedTime<OrderCloseTime()){
                           LastClosedTime=OrderCloseTime();
                              if(OrderProfit()<0){
                                 tLots=NormalizeDouble(OrderLots()*LotExponent,LotsDigits);
                              }
                              else{
                                 tLots=Lots;
                              }
                        }
                     }
                  }
                  else{
                     return(-3);
                  }
               }
         break;
      }
      
      if(AccountFreeMarginCheck(Symbol(),aTradeType,tLots)<=0){
         return(-1);
      }
      if(GetLastError()==134){
         return(-2);
      }
   return(tLots);     
} 

int CountTrades()
{
 int count=0;
 int trade;
 for(trade=OrdersTotal()-1;trade>=0;trade--)
 {
  OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
  
  if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
   continue;
   
  if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
  if(OrderType()==OP_SELL || OrderType()==OP_BUY)
   count++;
 }//for
 return(count);
}


void CloseThisSymbolAll()
{
 int trade;
 for(trade=OrdersTotal()-1;trade>=0;trade--)
 {
  OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);

  if(OrderSymbol()!=Symbol())
   continue;
  if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
  {
   if(OrderType()==OP_BUY)
    OrderClose(OrderTicket(),OrderLots(),Bid,slip,Blue);

   if(OrderType()==OP_SELL)
    OrderClose(OrderTicket(),OrderLots(),Ask,slip,Red);
  }
  Sleep(1000);
 }
}

int OpenPendingOrder(int pType,double pLots,double pLevel,int sp, double pr, int sl, int tp,string pComment,int pMagic,datetime pExpiration,color pColor)
{
  int ticket=0;
  int err=0;
  int c = 0;
  int NumberOfTries = 100;
  switch (pType)
  {
      case OP_BUYLIMIT:
         for(c = 0 ; c < NumberOfTries ; c++)
         {
            ticket=OrderSend(Symbol(),OP_BUYLIMIT,pLots,pLevel,sp,StopLong(pr,sl),TakeLong(pLevel,tp),pComment,pMagic,pExpiration,pColor);
            err=GetLastError();
            if(err==0)
            { 
               break;
            }
            else
            {
               if(err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(1000);
                  continue;
               }
               else //normal error
               {
                  break;
               }  
            }
         }   
         break;
      case OP_BUYSTOP:
         for(c = 0 ; c < NumberOfTries ; c++)
         {
            ticket=OrderSend(Symbol(),OP_BUYSTOP,pLots,pLevel,sp,StopLong(pr,sl),TakeLong(pLevel,tp),pComment,pMagic,pExpiration,pColor);
            err=GetLastError();
            if(err==0)
            { 
               break;
            }
            else
            {
               if(err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(5000);
                  continue;
               }
               else //normal error
               {
                  break;
               }  
            }
         } 
         break;
      case OP_BUY:
         for(c = 0 ; c < NumberOfTries ; c++)
         {  
            RefreshRates();
            ticket=OrderSend(Symbol(),OP_BUY,pLots,Ask,sp,StopLong(Bid,sl),TakeLong(Ask,tp),pComment,pMagic,pExpiration,pColor);
            err=GetLastError();
            if(err==0)
            { 
               break;
            }
            else
            {
               if(err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(5000);
                  continue;
               }
               else //normal error
               {
                  break;
               }  
            }
         } 
         break;
      case OP_SELLLIMIT:
         for(c = 0 ; c < NumberOfTries ; c++)
         {
            ticket=OrderSend(Symbol(),OP_SELLLIMIT,pLots,pLevel,sp,StopShort(pr,sl),TakeShort(pLevel,tp),pComment,pMagic,pExpiration,pColor);
            err=GetLastError();
            if(err==0)
            { 
               break;
            }
            else
            {
               if(err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(5000);
                  continue;
               }
               else //normal error
               {
                  break;
               }  
            }
         } 
         break;
      case OP_SELLSTOP:
         for(c = 0 ; c < NumberOfTries ; c++)
         {
            ticket=OrderSend(Symbol(),OP_SELLSTOP,pLots,pLevel,sp,StopShort(pr,sl),TakeShort(pLevel,tp),pComment,pMagic,pExpiration,pColor);
            err=GetLastError();
            if(err==0)
            { 
               break;
            }
            else
            {
               if(err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(5000);
                  continue;
               }
               else //normal error
               {
                  break;
               }  
            }
         } 
         break;
      case OP_SELL:
         for(c = 0 ; c < NumberOfTries ; c++)
         {
            ticket=OrderSend(Symbol(),OP_SELL,pLots,Bid,sp,StopShort(Ask,sl),TakeShort(Bid,tp),pComment,pMagic,pExpiration,pColor);
            err=GetLastError();
            if(err==0)
            { 
               break;
            }
            else
            {
               if(err==4 || err==137 ||err==146 || err==136) //Busy errors
               {
                  Sleep(5000);
                  continue;
               }
               else //normal error
               {
                  break;
               }  
            }
         } 
         break;
  } 
  
  return(ticket);
}  

double StopLong(double price,int stop)
{
 if(stop==0)
  return(0);
 else
  return(price-(stop*Point));
}

double StopShort(double price,int stop)
{
 if(stop==0)
  return(0);
 else
  return(price+(stop*Point));
}

double TakeLong(double price,int take)
{
 if(take==0)
  return(0);
 else
  return(price+(take*Point));
}

double TakeShort(double price,int take)
{
 if(take==0)
  return(0);
 else
  return(price-(take*Point));
}


double CalculateProfit()
{

   double Profit=0;
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
     continue;
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
     if(OrderType()==OP_BUY || OrderType()==OP_SELL)  
      {
       Profit=Profit+OrderProfit();
      }
   }

  return(Profit);
}

void TrailingAlls(int start,int stop, double AvgPrice)
{
 int profit;
 double stoptrade;
 double stopcal;
 
 if(stop==0)
  return;
 
 int trade;
 for(trade=OrdersTotal()-1;trade>=0;trade--)
 {
  if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
   continue;

  if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
   continue;

  if(OrderSymbol()==Symbol()||OrderMagicNumber()==MagicNumber)
  {
   if(OrderType()==OP_BUY)
   {
    profit=NormalizeDouble((Bid-AvgPrice)/Point,0);
    if(profit<start)
     continue;
    stoptrade=OrderStopLoss();
    stopcal=Bid-(stop*Point);
    if(stoptrade==0||(stoptrade!=0&&stopcal>stoptrade))
//     OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Blue);
     OrderModify(OrderTicket(),AvgPrice,stopcal,OrderTakeProfit(),0,Aqua);
   }//Long
  
   if(OrderType()==OP_SELL)
   {
    profit=NormalizeDouble((AvgPrice-Ask)/Point,0);
    if(profit<start)
     continue;
    stoptrade=OrderStopLoss();
    stopcal=Ask+(stop*Point);
    if(stoptrade==0||(stoptrade!=0&&stopcal<stoptrade))
//     OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Red);
     OrderModify(OrderTicket(),AvgPrice,stopcal,OrderTakeProfit(),0,Red);
   }//Shrt
  }
  Sleep(1000);
 }//for
}




double AccountEquityHigh()
{
 static double AccountEquityHighAmt,PrevEquity;
  if(CountTrades()==0) AccountEquityHighAmt=AccountEquity();
   if(AccountEquityHighAmt < PrevEquity) AccountEquityHighAmt=PrevEquity;
   else AccountEquityHighAmt=AccountEquity();
  PrevEquity = AccountEquity();
 return(AccountEquityHighAmt);
}


double FindLastBuyPrice()
{
 double oldorderopenprice = 0, orderprice;
 int cnt, oldticketnumber = 0, ticketnumber;
 
 for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
 {
  OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
  if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
   continue;
  if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderType()==OP_BUY)  
  {
     ticketnumber = OrderTicket();
     if(ticketnumber>oldticketnumber)
     {
      orderprice=OrderOpenPrice();
      oldorderopenprice=orderprice;
      oldticketnumber=ticketnumber;
     }
  }
 }
 
  return(orderprice);
}

double FindLastSellPrice()
{
 double oldorderopenprice = 0, orderprice;
 int cnt, oldticketnumber = 0, ticketnumber;
 
 for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
 {
  OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
  if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
   continue;
  if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderType()==OP_SELL)  
  {
     ticketnumber = OrderTicket();
     if(ticketnumber>oldticketnumber)
     {
      orderprice=OrderOpenPrice();
      oldorderopenprice=orderprice;
      oldticketnumber=ticketnumber;
     }
  }
 }
 
  return(orderprice);
}



В результате получаем вот такую картинку:


Рис.2. Один из результатов оптимизации эксперта с начала 2009 года.

Догоним и перегоним господина Таниса!

Добавим функцию Мартингейла к советнику.
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Возьмем простейший советник торгующий с фиксированными значениями стопов.


//+------------------------------------------------------------------+
//|                                                        WellX.mq4 |
//|                                            Copyright © 2011, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, AM2"
#property link      "http://www.forexsystems.biz"

#define MAGIC 20111010

extern double StopLoss   = 400;
extern double TakeProfit = 800;
extern double ADXPeriod  = 14;
extern double BBPeriod   = 20;
extern double BBDev      = 2;
extern int Level         = 30;
extern double Lots       = 1;

bool b=true, s=true;  

//+------------------------------------------------------------------+
int start()
  {
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;  
//----   
   int p=0;    
//---- get Indicatorrs 
   double bbh=iBands(NULL,0,BBPeriod,BBDev,0,PRICE_CLOSE,MODE_UPPER,0);
   double bbl=iBands(NULL,0,BBPeriod,BBDev,0,PRICE_CLOSE,MODE_LOWER,0);
   double adx=iADX(NULL,0,ADXPeriod,PRICE_CLOSE,MODE_MAIN,0);
  
//----

   for (int i=0; i<OrdersTotal(); i++)
   {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
         if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) continue;
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;       
      }   
   }  
//---- buy 
   if(adx<Level && Ask<bbl && b && p<1)  
     {
      OrderSend(Symbol(),OP_BUY,Lots,Ask,30,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MAGIC,0,Blue);
      b=false;
      s=true;  
     }        
//---- sell   
   if(adx<Level && Bid>bbh && s && p<1)  
     {
      OrderSend(Symbol(),OP_SELL,Lots,Bid,30,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MAGIC,0,Red );
      b=true; 
      s=false;
     }       
//----
   return(0);
  }
//+------------------------------------------------------------------+



Результат оптимизации эксперта с 2000-го года ниже:



Функция Мартингейла может иметь следующий вид:


//+------------------------------------------------------------------+
int LossCount = 0;
double LotsArray[]={0.1,0.2,0.4,0.8,1.6,3.2};

...

double Lots()
 {
   double Lot = Lots;
   int total = OrdersHistoryTotal();
   for (int i = 0; i < total; i++)
    {
      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
       {
         if (OrderProfit() > 0)
          {
            Lot=LotsArray[0];
            LossCount = 0;    
          }         
          else
           {
            Lot=LotsArray[LossCount+1];
            LossCount++;
           }
       }
    }
   return(Lot);
}
//+------------------------------------------------------------------+


Остается только собрать все воедино:


//+------------------------------------------------------------------+
//|                                                        WellX.mq4 |
//|                                            Copyright © 2011, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, AM2"
#property link      "http://www.forexsystems.biz"

#define MAGIC 20111010

extern double StopLoss   = 400;
extern double TakeProfit = 800;
extern double ADXPeriod  = 14;
extern double BBPeriod   = 20;
extern double BBDev      = 2;
extern int Level         = 30;
extern double Lots       = 0.1;

int LossCount = 0;
double LotsArray[]={0.1,0.2,0.4,0.8,1.6,3.2};
bool b=true, s=true;

//+------------------------------------------------------------------+
int start()
  {
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;  
//----   
   int p=0;    
//---- get Indicatorrs 
   double bbh=iBands(NULL,0,BBPeriod,BBDev,0,PRICE_CLOSE,MODE_UPPER,0);
   double bbl=iBands(NULL,0,BBPeriod,BBDev,0,PRICE_CLOSE,MODE_LOWER,0);
   double adx=iADX(NULL,0,ADXPeriod,PRICE_CLOSE,MODE_MAIN,0);
  
//----

   for (int i=0; i<OrdersTotal(); i++)
   {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
         if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) continue;
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;       
      }   
   }  
//---- buy 
   if(adx<Level && Ask<bbl && b && p<1)  
     {
      OrderSend(Symbol(),OP_BUY,Lots(),Ask,30,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MAGIC,0,Blue);
      b=false;
      s=true;  
     }        
//---- sell   
   if(adx<Level && Bid>bbh && s && p<1)  
     {
      OrderSend(Symbol(),OP_SELL,Lots(),Bid,30,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MAGIC,0,Red );
      b=true; 
      s=false;
     }       
//----
   return(0);
  }
//+------------------------------------------------------------------+
double Lots()
 {
   double Lot = Lots;
   int total = OrdersHistoryTotal();
   for (int i = 0; i < total; i++)
    {
      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
       {
         if (OrderProfit() > 0)
          {
            Lot=LotsArray[0];
            LossCount = 0;    
          }         
          else
           {
            Lot=LotsArray[LossCount+1];
            LossCount++;
           }
       }
    }
   return(Lot);
}
//+------------------------------------------------------------------+


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



Результат с того же 2000-го года.

Дерзайте, юные умы!

Тестирование эксперта Bobsley на реальном счете.
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Уважаемая администрация я хотел бы протестировать советник Bobsley на реальном торговом счете. Данные счета и советник с настройками отправлены по почте на адрес <info@opentraders.ru>.



Рис.1. Результат работы эксперта 2011.01.04-2011.05.10.

И здесь чемпион оказался на высоте. 500% за два месяца!
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Сегодня просматривая рейтинг ПАММ счетов на Инстафорекс, в самом верху рейтинга обнаружил небезизвестного нам Бориса Одинцова — чемпиона Automated Trading Championship 2010.

Извольте полюбопытствовать!


Рис.1. Мониторинг счета.


Рис.2. Баланс.Средства.

Более подробную информацию вы можете получить перейдя по ссылке:
instaforex.com/ru/pamm_monitoring.php?user=5023161

Как прикрутить к советнику трейлингстоп и вывод в безубыток?
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Как известно вывод позиции в безубыток и последующий трейлинг позиции, могут значительно повысить прибыльность торговой системы.

Чтобы проделать необходимые нам операции воспользуемся готовыми функциями трейлингстопа и БУ.

( Читать полностью... )

Как написать простейший советник на MQL4?
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Подобным вопросом наверняка задается любой новичок желающий освоить написание экспертов для торговли на рынке FOREX. При желании и некоторой сноровке эту задачу можно решить за один вечер.

Для начала сформулируем правила открытия и закрытия позиций.

( Читать полностью... )

От 100 до 300$ в управление от FXStart
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Подал заявку на участие в инвестиционной программе.

( Читать полностью... )

Cоветник "Метод Пуриа".
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Советник, которым сейчас торгует на чемпионате участник с ником Buter. 2-е место в рейтинге.
championship.mql5.com/2010/ru/users/Buter



Результаты в тестере МТ4 за этот год.

EURUSD
M30
TP 350
SL 650
Лот 5-15

*улыбается*



СКАЧАТЬ СОВЕТНИК «МЕТОД ПУРИА»

#описание метода

 

Тестирование советника "BOBSLEY".
Аватар AM2
AM2
Сообщений: 194
Уровень 5

Участвуя в чемпионате мира по автотрейдингу обратил внимание на советник участника с ником bobsley. Проанализировал его сделки и написал подобный советник сначала в МТ5 затем в МТ4.

Это сделки бобслея на чемпионате:



А это сделки клона бобслея.



Как можно видеть из рисунков системы подобные.

Таймфрейм 5М
Инструмент EURUSD
Период тестирования Last Year
Начальный депозит 10000$
Лот 2-5

Советник торгует по тренду на основе SMA и Stochastic.

======================

СКАЧАТЬ СОВЕТНИК BOBSLEY

 
=========== Советник участвует в Тестовой лаборатории ==============

Демо-счет 1 (нажмите на график, чтобы увеличить):

Начальный депозит: 100 000
Начало тестирования: 25.10.2010
Окончание тестирования: 20.12.2010 (по техническим причинам — #подробнее)

 
Демо-счет 2 (нажмите на график, чтобы увеличить):

Начальный депозит: 10 000
Начало тестирования: 17.02.2011
Окончание тестирования: 06.05.2011 (перенос на реальный счет — #подробнее)

 
Реальный счет 3 (нажмите на график, чтобы увеличить):

Начальный депозит: 1381,05
Начало тестирования: 23.05.2011
Перерыв в тестировании: 20.10.2011 — 7.11.2011
Окончание тестирования: 20.02.2012
Результат: -74%

Текущий статус: ПроваленоТест на реальном счете провален
 
=========== Важное из комментариев: ==============:

#Изменение настроек 13.07.2011

#Попытка прикрутить расчет лота
#Как заставить работать советник с несколькими ордерами одновременно?