0
Нужны четкие условия для входа. Опишите их максимально подробно, а то это все уже слишком затянулось.
avatar

AM2

  • 7 марта 2016, 12:58
0
Нужно писать дополнительную функцию, которая будет проверять какая машка сейчас выше всех и от нее считать расстояние. А сейчас условие 3 крайних машки выстроились в ряд.
avatar

AM2

  • 7 марта 2016, 12:57
0
Сейчас стоит условие на открытие 3 машки в ряд плюс дельта, так как у вас на скрине никак не получится.
avatar

AM2

  • 7 марта 2016, 12:47
0
Сейчас на скрине видно что самый первый ордер закрывается по ТП 50 а далее если он не закрылся по тейку уже идет расчет по общему тейку 300. Так нужно?


extern int    TakeProfit  = 300;         // общий язь
extern int    TakeProfit1 = 50;          // язь 1-го ордера


avatar

AM2

  • 7 марта 2016, 12:44
+2
Я сейчас попробовал сделать функцию чтобы снимала двойной сигнал со сдвигом, это долго, обращайтесь к платному.

Вот наброски моих функций может кому то они пригодятся.


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int BuyDualSignal()
  {
   int sig=0;
   for(int i=1;i<=ShiftSig;i++)
     {
      double BBBlue=iCustom(NULL,0,IndName1,Length,Deviation,0,Shift);
      double BBRed2=iCustom(NULL,0,IndName1,Length,Deviation,1,Shift+1);
      double BBRedI2=iCustom(NULL,0,IndName1,Length,Deviation,1,Shift+i);
      double OzyRed2=iCustom(NULL,0,IndName2,Period_1,Period_2,1,Shift+1);
      double BBBlueI=iCustom(NULL,0,IndName1,Length,Deviation,0,i);
      double OzyBlue=iCustom(NULL,0,IndName2,Period_1,Period_2,0,Shift);
      double OzyBlueI=iCustom(NULL,0,IndName2,Period_1,Period_2,0,Shift+i);
      double OzyRedI2=iCustom(NULL,0,IndName2,Period_1,Period_2,1,Shift+1+i);
      if(BBBlue>0 && BBRed2>0 && OzyBlueI>0 && OzyRedI2) {sig=1;break;}
      if(OzyBlue>0 && OzyRed2>0 && BBBlueI>0 && BBRedI2) {sig=1;break;}
     }
   return(sig);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int SellDualSignal()
  {
   int sig=0;
   for(int i=1;i<=ShiftSig;i++)
     {
      double BBBlue2=iCustom(NULL,0,IndName1,Length,Deviation,0,Shift+1);
      double BBRed=iCustom(NULL,0,IndName1,Length,Deviation,1,Shift);
      double BBRed2=iCustom(NULL,0,IndName1,Length,Deviation,1,Shift+1);
      double BBRedI=iCustom(NULL,0,IndName1,Length,Deviation,1,Shift+i);
      double BBRedI2=iCustom(NULL,0,IndName1,Length,Deviation,1,Shift+i);
      double OzyRed2=iCustom(NULL,0,IndName2,Period_1,Period_2,1,Shift+1);
      double BBBlueI=iCustom(NULL,0,IndName1,Length,Deviation,0,i);
      double BBBlueI2=iCustom(NULL,0,IndName1,Length,Deviation,0,Shift+1+i);
      double OzyBlue=iCustom(NULL,0,IndName2,Period_1,Period_2,0,Shift);
      double OzyBlueI=iCustom(NULL,0,IndName2,Period_1,Period_2,0,Shift+i);
      double OzyBlueI2=iCustom(NULL,0,IndName2,Period_1,Period_2,0,Shift+1+i);
      double OzyBlue2=iCustom(NULL,0,IndName2,Period_1,Period_2,0,Shift+1);
      double OzyRedI=iCustom(NULL,0,IndName2,Period_1,Period_2,1,Shift+i);
      double OzyRed=iCustom(NULL,0,IndName2,Period_1,Period_2,1,Shift);
      double OzyRedI2=iCustom(NULL,0,IndName2,Period_1,Period_2,1,Shift+1+i);
      if(BBRed>0 && BBBlue2>0 && OzyRedI>0 && OzyBlueI2) {sig=1;break;}
      if(OzyRed>0 && OzyBlue2>0 && BBRedI>0 && BBBlueI2) {sig=1;break;}
     }
   return(sig);
  }
avatar

AM2

  • 7 марта 2016, 11:25
0
Посмотрите:


//+------------------------------------------------------------------+
//|                                                          3MA.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

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

extern int StopLoss     = 1200;      // лось
extern int TakeProfit   = 1400;      // язь
extern int Delta1       = 100;       // минимальное расстояние от машки до закрытия
extern int Delta2       = 100;       // максимальное расстояние от машки до закрытия
extern int Points       = 100;       // сколько добавляем к тейку
extern int Count        = 5;         // количество ордеров
extern int Slip         = 50;        // реквот

extern int StartHour    = 0;         // час начала торговли
extern int StartMin     = 30;        // минута начала торговли
extern int EndHour      = 23;        // час окончания торговли
extern int EndMin       = 30;        // минута окончания торговли

extern int MA1Period    = 11;        // период МА1
extern int MA1Mode      = 0;         // 0-SMA
extern int MA1Price     = 0;         // 0-Close

extern int MA2Period    = 22;        // период МА1
extern int MA2Mode      = 0;         // 0-SMA
extern int MA2Price     = 0;         // 0-Close

extern int MA3Period    = 33;        // период МА1
extern int MA3Mode      = 0;         // 0-SMA
extern int MA3Price     = 0;         // 0-Close

extern int MA4Period    = 44;        // период МА1
extern int MA4Mode      = 0;         // 0-SMA
extern int MA4Price     = 0;         // 0-Close

extern int MA5Period    = 55;        // период МА1
extern int MA5Mode      = 0;         // 0-SMA
extern int MA5Price     = 0;         // 0-Close

extern int MA6Period    = 66;        // период МА1
extern int MA6Mode      = 0;         // 0-SMA
extern int MA6Price     = 0;         // 0-Close

extern int MA7Period    = 77;        // период МА1
extern int MA7Mode      = 0;         // 0-SMA
extern int MA7Price     = 0;         // 0-Close

extern int MA8Period    = 88;        // период МА1
extern int MA8Mode      = 0;         // 0-SMA
extern int MA8Price     = 0;         // 0-Close

extern int MA9Period    = 99;        // период МА1
extern int MA9Mode      = 0;         // 0-SMA
extern int MA9Price     = 0;         // 0-Close
extern int Magic        = 123;       // магик
extern double Lots      = 0.1;       // лот

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,int c)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

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

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

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int i=0;
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);
   double ma2=iMA(NULL,0,MA2Period,0,MA2Mode,MA2Price,1);
   double ma3=iMA(NULL,0,MA3Period,0,MA3Mode,MA3Price,1);
   double ma4=iMA(NULL,0,MA4Period,0,MA4Mode,MA4Price,1);
   double ma5=iMA(NULL,0,MA5Period,0,MA5Mode,MA5Price,1);
   double ma6=iMA(NULL,0,MA6Period,0,MA6Mode,MA6Price,1);
   double ma7=iMA(NULL,0,MA7Period,0,MA7Mode,MA7Price,1);
   double ma8=iMA(NULL,0,MA8Period,0,MA8Mode,MA8Price,1);
   double ma9=iMA(NULL,0,MA9Period,0,MA9Mode,MA9Price,1);
   

//---- buy 
   if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point && ma1>ma2 && ma2>ma3 && ma3>ma4 && ma4>ma5 && ma5>ma6 && ma6>ma7)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(0,Ask,i);
        }
     }
//---- sell   
   if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point && ma1<ma2 && ma2<ma3 && ma3<ma4 && ma4<ma5 && ma5<ma6 && ma6<ma7)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(1,Bid,i);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos()
  {
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);
   double ma2=iMA(NULL,0,MA2Period,0,MA2Mode,MA2Price,1);
   double ma3=iMA(NULL,0,MA3Period,0,MA3Mode,MA3Price,1);
   double ma4=iMA(NULL,0,MA4Period,0,MA4Mode,MA4Price,1);
//---
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point && ma1<ma2 && ma2<ma3 && ma3<ma4)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point && ma1>ma2 && ma2>ma3 && ma3>ma4)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    hb - часы времени начала торговли                                       |
//|    mb - минуты времени начала торговли                                     |
//|    he - часы времени окончания торговли                                    |
//|    me - минуты времени окончания торговли                                  |
//+----------------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
  {
   datetime db, de;           // Время начала и окончания работы
   int      hc;               // Часы текущего времени торгового сервера

   db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
   hc=TimeHour(TimeCurrent());

   if(db>=de)
     {
      if(hc>=he) de+=24*60*60; else db-=24*60*60;
     }

   if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
   else return(False);
  }  
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      OpenPos();
     }
   else ClosePos();
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 7 марта 2016, 10:06
0
Сделать закрытие по противоположному сигналу или просто 3 машки в ряд?
avatar

AM2

  • 7 марта 2016, 09:59
0
У меня закрытие старое осталось, поправлю.
avatar

AM2

  • 7 марта 2016, 09:50
0
Там, чуток, не так выходит. В тестере, первый ордер закрывается, как положено, а следующий, после удачно закрытого первого, модифицирует t/p правильно, но закрывает не по t/p, а по профиту, в валюте депозита, а он общий, для всей серии ордеров. Поэтому в т.з. (п.1), я и оговаривал, отдельный профит, для первого ордера.


Покажите этот момент на скрине. Закрытие по профиту в валюте можно отключить если поставить 0 в настройках.
avatar

AM2

  • 6 марта 2016, 22:22
0
Вот, только одну сделку за неделю открыл и не понятно по какому принципу (дельту ставил от 100 до 400)


Значит к тому моменту только выстроились машки и образовалась дельта в интервале.
Вот сделки и настройки.

avatar

AM2

  • 6 марта 2016, 22:17
0
Сейчас сделал чтобы 7 машек проверял. В середину не влезает.


//+------------------------------------------------------------------+
//|                                                          3MA.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

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

extern int StopLoss     = 1200;      // лось
extern int TakeProfit   = 1400;      // язь
extern int Delta1       = 100;       // минимальное расстояние от машки до закрытия
extern int Delta2       = 100;       // максимальное расстояние от машки до закрытия
extern int Points       = 100;       // сколько добавляем к тейку
extern int Count        = 5;         // количество ордеров
extern int Slip         = 50;        // реквот

extern int StartHour    = 0;         // час начала торговли
extern int StartMin     = 30;        // минута начала торговли
extern int EndHour      = 23;        // час окончания торговли
extern int EndMin       = 30;        // минута окончания торговли

extern int MA1Period    = 11;        // период МА1
extern int MA1Mode      = 0;         // 0-SMA
extern int MA1Price     = 0;         // 0-Close

extern int MA2Period    = 22;        // период МА1
extern int MA2Mode      = 0;         // 0-SMA
extern int MA2Price     = 0;         // 0-Close

extern int MA3Period    = 33;        // период МА1
extern int MA3Mode      = 0;         // 0-SMA
extern int MA3Price     = 0;         // 0-Close

extern int MA4Period    = 44;        // период МА1
extern int MA4Mode      = 0;         // 0-SMA
extern int MA4Price     = 0;         // 0-Close

extern int MA5Period    = 55;        // период МА1
extern int MA5Mode      = 0;         // 0-SMA
extern int MA5Price     = 0;         // 0-Close

extern int MA6Period    = 66;        // период МА1
extern int MA6Mode      = 0;         // 0-SMA
extern int MA6Price     = 0;         // 0-Close

extern int MA7Period    = 77;        // период МА1
extern int MA7Mode      = 0;         // 0-SMA
extern int MA7Price     = 0;         // 0-Close

extern int MA8Period    = 88;        // период МА1
extern int MA8Mode      = 0;         // 0-SMA
extern int MA8Price     = 0;         // 0-Close

extern int MA9Period    = 99;        // период МА1
extern int MA9Mode      = 0;         // 0-SMA
extern int MA9Price     = 0;         // 0-Close
extern int Magic        = 123;       // магик
extern double Lots      = 0.1;       // лот

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,int c)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

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

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

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int i=0;
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);
   double ma2=iMA(NULL,0,MA2Period,0,MA2Mode,MA2Price,1);
   double ma3=iMA(NULL,0,MA3Period,0,MA3Mode,MA3Price,1);
   double ma4=iMA(NULL,0,MA4Period,0,MA4Mode,MA4Price,1);
   double ma5=iMA(NULL,0,MA5Period,0,MA5Mode,MA5Price,1);
   double ma6=iMA(NULL,0,MA6Period,0,MA6Mode,MA6Price,1);
   double ma7=iMA(NULL,0,MA7Period,0,MA7Mode,MA7Price,1);
   double ma8=iMA(NULL,0,MA8Period,0,MA8Mode,MA8Price,1);
   double ma9=iMA(NULL,0,MA9Period,0,MA9Mode,MA9Price,1);
   

//---- buy 
   if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point && ma1>ma2 && ma2>ma3 && ma3>ma4 && ma4>ma5 && ma5>ma6 && ma6>ma7)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(0,Ask,i);
        }
     }
//---- sell   
   if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point && ma1<ma2 && ma2<ma3 && ma3<ma4 && ma4<ma5 && ma5<ma6 && ma6<ma7)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(1,Bid,i);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos()
  {
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);

//---
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    hb - часы времени начала торговли                                       |
//|    mb - минуты времени начала торговли                                     |
//|    he - часы времени окончания торговли                                    |
//|    me - минуты времени окончания торговли                                  |
//+----------------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
  {
   datetime db, de;           // Время начала и окончания работы
   int      hc;               // Часы текущего времени торгового сервера

   db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
   hc=TimeHour(TimeCurrent());

   if(db>=de)
     {
      if(hc>=he) de+=24*60*60; else db-=24*60*60;
     }

   if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
   else return(False);
  }  
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      OpenPos();
     }
   else ClosePos();
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 6 марта 2016, 19:13
0
У меня по самому быстрому считает
avatar

AM2

  • 6 марта 2016, 18:56
0
Сделал в упрощенном варианте: www.opentraders.ru/downloads/1045/

avatar

AM2

  • 6 марта 2016, 18:54
0
По одному заказу только уважаемый :) 
avatar

AM2

  • 6 марта 2016, 15:00
+2

ENUM_MA_METHOD
Идентификатор
Значение
Описание
MODE_SMA
0
Простое усреднение
MODE_EMA
1
Экспоненциальное усреднение
MODE_SMMA
2
Сглаженное усреднение
MODE_LWMA
3
Линейно-взвешенное усреднение



ENUM_APPLIED_PRICE
Константа
Значение
Описание
PRICE_CLOSE
0
Цена закрытия
PRICE_OPEN
1
Цена открытия
PRICE_HIGH
2
Максимальная за период цена
PRICE_LOW
3
Минимальная за период цена
PRICE_MEDIAN
4
Медианная цена, (high+low)/2
PRICE_TYPICAL
5
Типичная цена, (high+low+close)/3
PRICE_WEIGHTED
6
Взвешенная цена закрытия, (high+low+close+close)/4
avatar

AM2

  • 6 марта 2016, 14:58
0
Если закрывается по тейку язь для 1 лота будет 250 при ТП 250. Этого не достаточно?
avatar

AM2

  • 6 марта 2016, 14:55
0
Добрался и до вашего. Сегодня буду смотреть.
avatar

AM2

  • 6 марта 2016, 12:30
+1
Уговорили 9 :) 




//+------------------------------------------------------------------+
//|                                                          3MA.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

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

extern int StopLoss     = 1200;      // лось
extern int TakeProfit   = 1400;      // язь
extern int Delta1       = 100;       // минимальное расстояние от машки до закрытия
extern int Delta2       = 100;       // максимальное расстояние от машки до закрытия
extern int Points       = 100;       // сколько добавляем к тейку
extern int Count        = 5;         // количество ордеров
extern int Slip         = 50;        // реквот

extern int StartHour    = 0;         // час начала торговли
extern int StartMin     = 30;        // минута начала торговли
extern int EndHour      = 23;        // час окончания торговли
extern int EndMin       = 30;        // минута окончания торговли

extern int MA1Period    = 11;        // период МА1
extern int MA1Mode      = 0;         // 0-SMA
extern int MA1Price     = 0;         // 0-Close

extern int MA2Period    = 22;        // период МА1
extern int MA2Mode      = 0;         // 0-SMA
extern int MA2Price     = 0;         // 0-Close

extern int MA3Period    = 33;        // период МА1
extern int MA3Mode      = 0;         // 0-SMA
extern int MA3Price     = 0;         // 0-Close

extern int MA4Period    = 44;        // период МА1
extern int MA4Mode      = 0;         // 0-SMA
extern int MA4Price     = 0;         // 0-Close

extern int MA5Period    = 55;        // период МА1
extern int MA5Mode      = 0;         // 0-SMA
extern int MA5Price     = 0;         // 0-Close

extern int MA6Period    = 66;        // период МА1
extern int MA6Mode      = 0;         // 0-SMA
extern int MA6Price     = 0;         // 0-Close

extern int MA7Period    = 77;        // период МА1
extern int MA7Mode      = 0;         // 0-SMA
extern int MA7Price     = 0;         // 0-Close

extern int MA8Period    = 88;        // период МА1
extern int MA8Mode      = 0;         // 0-SMA
extern int MA8Price     = 0;         // 0-Close

extern int MA9Period    = 99;        // период МА1
extern int MA9Mode      = 0;         // 0-SMA
extern int MA9Price     = 0;         // 0-Close
extern int Magic        = 123;       // магик
extern double Lots      = 0.1;       // лот

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,int c)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

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

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

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int i=0;
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);
   double ma2=iMA(NULL,0,MA2Period,0,MA2Mode,MA2Price,1);
   double ma3=iMA(NULL,0,MA3Period,0,MA3Mode,MA3Price,1);
   double ma4=iMA(NULL,0,MA4Period,0,MA4Mode,MA4Price,1);
   double ma5=iMA(NULL,0,MA5Period,0,MA5Mode,MA5Price,1);
   double ma6=iMA(NULL,0,MA6Period,0,MA6Mode,MA6Price,1);
   double ma7=iMA(NULL,0,MA7Period,0,MA7Mode,MA7Price,1);
   double ma8=iMA(NULL,0,MA8Period,0,MA8Mode,MA8Price,1);
   double ma9=iMA(NULL,0,MA9Period,0,MA9Mode,MA9Price,1);
   

//---- buy 
   if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(0,Ask,i);
        }
     }
//---- sell   
   if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(1,Bid,i);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos()
  {
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);

//---
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    hb - часы времени начала торговли                                       |
//|    mb - минуты времени начала торговли                                     |
//|    he - часы времени окончания торговли                                    |
//|    me - минуты времени окончания торговли                                  |
//+----------------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
  {
   datetime db, de;           // Время начала и окончания работы
   int      hc;               // Часы текущего времени торгового сервера

   db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
   hc=TimeHour(TimeCurrent());

   if(db>=de)
     {
      if(hc>=he) de+=24*60*60; else db-=24*60*60;
     }

   if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
   else return(False);
  }  
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      OpenPos();
     }
   else ClosePos();
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 6 марта 2016, 12:25
+2
Добавил новый расчет лота и паузу после закрытия по профиту. п.3. по мере поступления :)  www.opentraders.ru/downloads/1059/

avatar

AM2

  • 6 марта 2016, 11:43