0
Я сымитировал работу копировщика в тестере. После появления ордера от копировщика, советник добавляет ордер с рассчитанным лотом, при обратном сигнале закрываем предыдущие позы и добавляем новую. Только ошибку закрытия долго не могу выловить.




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

//--- Inputs
extern double Lots      = 0.01;     // лот копировщика
extern double Depo1     = 1000;     // депо
extern double Lot1      = 0.1;      // лот
extern double Depo2     = 2000;     // депо
extern double Lot2      = 0.2;      // лот
extern double Depo3     = 3000;     // депо
extern double Lot3      = 0.3;      // лот
extern double Depo4     = 4000;     // депо
extern double Lot4      = 0.4;      // лот
extern double Depo5     = 5000;     // депо
extern double Lot5      = 0.5;      // лот
extern double Depo6     = 6000;     // депо
extern double Lot6      = 0.6;      // лот
extern double Depo7     = 7000;     // депо
extern double Lot7      = 0.7;      // лот
extern double Depo8     = 8000;     // депо
extern double Lot8      = 0.8;      // лот
extern double Depo9     = 9000;     // депо
extern double Lot9      = 0.9;      // лот
extern double Depo10    = 10000;    // депо
extern double Lot10     = 1;        // лот


extern int StopLoss     = 500;      // лось
extern int TakeProfit   = 500;      // язь
extern int Slip         = 30;       // реквот
extern int Magic        = 123;      // магик советника
extern int CMagic       = 111;      // магик копировщика

int b=0,s=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(int type,int magic)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double lot,int magic)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

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

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

   r=OrderSend(NULL,type,lot,NormalizeDouble(price,Digits),Slip,sl,tp,"",magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int type)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || OrderMagicNumber()==CMagic))
           {
            if(OrderType()==type) cl=OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
            if(OrderType()==type) cl=OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
           }
        }
     }
   //return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   if(AccountBalance()<Depo1) lot=Lots;
   if(AccountBalance()>=Depo1 && AccountBalance()<Depo2) lot=Lot1;
   if(AccountBalance()>=Depo2 && AccountBalance()<Depo3) lot=Lot2;
   if(AccountBalance()>=Depo3 && AccountBalance()<Depo4) lot=Lot3;
   if(AccountBalance()>=Depo4 && AccountBalance()<Depo5) lot=Lot4;
   if(AccountBalance()>=Depo5 && AccountBalance()<Depo6) lot=Lot5;
   if(AccountBalance()>=Depo6 && AccountBalance()<Depo7) lot=Lot6;
   if(AccountBalance()>=Depo7 && AccountBalance()<Depo8) lot=Lot7;
   if(AccountBalance()>=Depo8 && AccountBalance()<Depo9) lot=Lot8;
   if(AccountBalance()>=Depo9 && AccountBalance()<Depo10) lot=Lot9;
   if(AccountBalance()>=Depo10) lot=Lot10;

   return(lot);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double rsi=iRSI(NULL,0,14,0,1);
// имитация работы копировщика
   if(IsTesting())
     {
      if(rsi<30 && CountTrades(0,CMagic)<1) PutOrder(0,Ask,Lots,CMagic);
      if(rsi>70 && CountTrades(1,CMagic)<1) PutOrder(1,Bid,Lots,CMagic);
     }

// ставим ордера того же направления с перерасчитанным лотом
   if(CountTrades(0,CMagic)>0 && CountTrades(0,Magic)<1)
     {
      CloseAll(1); //Появился сигнал бай кроем селлы
      PutOrder(0,Ask,Lot(),Magic);
     }

   if(CountTrades(1,CMagic)>0 && CountTrades(1,Magic)<1) 
     {
      CloseAll(0); //Появился сигнал селл кроем баи
      PutOrder(1,Bid,Lot(),Magic);
     }

   Comment("\n Balance: ",DoubleToString(AccountBalance(),2),
           "\n Lots: ",Lot());
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 23 февраля 2016, 11:25
0
Поменял перебор ордеров: www.opentraders.ru/downloads/1051/

avatar

AM2

  • 23 февраля 2016, 01:00
0
Если нужно открыть после 3-го через 280 п. и в это время не будут открываться сеточные ордера, тогда нужно еще и сетку переписывать. Это к платному.
avatar

AM2

  • 22 февраля 2016, 20:44
0
Вы серьезно думаете что за такую тучу работы кто то возьмется бесплатно?
avatar

AM2

  • 22 февраля 2016, 20:38
+1
Цвет меток и расположение в углах графика можно регулировать в настройках.
avatar

AM2

  • 22 февраля 2016, 20:25
0
Как вы себе это представляете? Если ставим лок после каждого третьего ордера, а расстояние лока от ордера будет больше чем шаг между ордерами, тогда лок будет уже после каждого четвертого сеточного ордера. Тогда так и нужно задать в настройках. Как считаете?
avatar

AM2

  • 22 февраля 2016, 20:13
0
А чего ждем? :) 
avatar

AM2

  • 22 февраля 2016, 20:00
0
Я часов 6 с ним просидел пока никак.
avatar

AM2

  • 22 февраля 2016, 19:59
+1
В 2-х словах: как им пользоваться, где и когда сигнал брать?


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

AM2

  • 22 февраля 2016, 19:51
+1
Может еще попробовать такую конструкцию перебора ордеров как в илане:


int CountTrades()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      bool s=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++;
     }
   return (count);
  }
avatar

AM2

  • 22 февраля 2016, 18:59
+4
Как то один раз уже было такое и тоже на праздники *drinks* 
После этого я написал образец ТЗ: am2.opentraders.ru/29048.html
В предложенном образце все четко, без всяких неясностей и разночтений.
Какое ТЗ такой и результат.

Мое видение этого задания:

Техническое задание

Торговый советник для торгового терминала МТ4

1. Суть работы советника:

Ордер выставленный копировщиком, удаляется и вместо него выставляется рыночный ордер того же направления с объемом рассчитанным согласно значениям в настройках:

//--- Inputs
extern double Lots      = 0.01;     // минимальный лот
extern double Depo1     = 1000;     // депо
extern double Lot1      = 0.1;      // лот
extern double Depo2     = 2000;     // депо
extern double Lot2      = 0.2;      // лот
extern double Depo3     = 3000;     // депо
extern double Lot3      = 0.3;      // лот
extern double Depo4     = 4000;     // депо
extern double Lot4      = 0.4;      // лот
extern double Depo5     = 5000;     // депо
extern double Lot5      = 0.5;      // лот
extern double Depo6     = 6000;     // депо
extern double Lot6      = 0.6;      // лот
extern double Depo7     = 7000;     // депо
extern double Lot7      = 0.7;      // лот
extern double Depo8     = 8000;     // депо
extern double Lot8      = 0.8;      // лот
extern double Depo9     = 9000;     // депо
extern double Lot9      = 0.9;      // лот
extern double Depo10    = 10000;    // депо
extern double Lot10     = 1;        // лот




• Советник торгует в реверс (LONG/SHORT)
• В советнике должен быть реализован StopLoss,
• В советнике должен быть реализован Takeprofit
• Установка динамического лота для торговли,
• Выбор таймфрейма в зависимости от выбранного окна графика,
• Magic

1. Тейкпрофит и стоплосс
1. 0 — параметр отключен, и Тейкпрофит сделки будет равен 0.
2. 0 — параметр отключен, и Стоплосс сделки будет равен 0.

2. Условия входа и выхода

2.1. Вход в длинную позицию осуществляется по следующему условию:

Выставлен ордер от копировщика на покупку. Ордер удаляется советником и ставится того же направления с объемом рассчитанным согласно значениям в настройках.

Выход из длинной позиции

Копировщиком выставлен ордер обратного направления, т.е. на продажу.

2.2. Вход в короткую позицию осуществляется по следующему условию:

Выставлен ордер от копировщика на продажу. Ордер удаляется советником и ставится того же направления с объемом рассчитанным согласно значениям в настройках.

Выход из короткой позиции

Копировщиком выставлен ордер обратного направления, т.е. на покупку.

2. Выставление заявок
Все ордера, формируемые советником, являются рыночными
avatar

AM2

  • 22 февраля 2016, 16:05
0
А это с мейлами:


//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, forex4live.com"
#property link      "http://www.forex4live.com/"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 DodgerBlue

extern string TimeFrame="All tf";
extern int HalfLength=61;
extern int Price=0;
extern double ATRMultiplier=2.6;
extern int ATRPeriod=110;
extern bool Interpolate=TRUE;
extern bool alertsOn=FALSE;
extern bool alertsOnCurrent = FALSE;
extern bool alertsOnHighLow = FALSE;
extern bool alertsMessage=FALSE;
extern bool alertsSound = FALSE;
extern bool alertsEmail = FALSE;

extern int MAPeriod=35;
extern int MAShift=0;
extern int MAMethod=0; //0 - Простое усреднение 1 - Экспоненциальное усреднение 2 - Сглаженное усреднение 3 - Линейно-взвешенное усреднение
extern int MAPrice=0;
extern int Shift=1;
/*
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
*/
extern string BuyText  = "BuySignal";
extern string SellText = "SellSignal";

double G_ibuf_132[];
double G_ibuf_136[];
double G_ibuf_140[];
double G_ibuf_144[];
string Gs_148;
bool G_bool_156;
bool G_bool_160;
int G_timeframe_164;
string Gs_nothing_168="nothing";
datetime G_time_176;
string Gsa_180[]={"M1","M5","M15","M30","H1","H4","D1","W1","MN"};
int Gia_184[]={1,5,15,30,60,240,1440,10080,43200};
// E37F0136AA3FFAF149B351F6A4C948E9
datetime t=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   string Lsa_0[256];
   for(int index_4=0; index_4<256; index_4++) Lsa_0[index_4]=CharToStr(index_4);
   int str2int_8=StrToInteger(Lsa_0[67]+Lsa_0[111]+Lsa_0[112]+Lsa_0[121]+Lsa_0[32]+Lsa_0[82]+Lsa_0[105]+Lsa_0[103]+Lsa_0[104]+Lsa_0[116]+Lsa_0[32]+
                              Lsa_0[169]+Lsa_0[32]+Lsa_0[75]+Lsa_0[97]+Lsa_0[122]+Lsa_0[97]+Lsa_0[111]+Lsa_0[111]+Lsa_0[32]+Lsa_0[50]+Lsa_0[48]+Lsa_0[49]+Lsa_0[49]+Lsa_0[32]);
   IndicatorBuffers(4);
   HalfLength=MathMax(HalfLength,1);
   SetIndexBuffer(0,G_ibuf_132);
   SetIndexDrawBegin(0,HalfLength);
   SetIndexBuffer(1,G_ibuf_136);
   SetIndexDrawBegin(1,HalfLength);
   SetIndexBuffer(2,G_ibuf_140);
   SetIndexDrawBegin(2,HalfLength);
   SetIndexBuffer(3,G_ibuf_144);
   Gs_148=WindowExpertName();
   G_bool_160=TimeFrame=="returnBars";
   if(G_bool_160) return (0);
   G_bool_156=TimeFrame=="calculateValue";
   if(G_bool_156) return (0);
   G_timeframe_164=f0_3(TimeFrame);
   IndicatorShortName(f0_0(G_timeframe_164)+" TMA bands )"+HalfLength+")");
   return (0);
  }
// 52D46093050F38C27267BCE42543EF60
int deinit()
  {
   return (0);
  }
// EA2B2676C28C0DB26D39331A336C6B92
int start()
  {
   double MA1=iMA(NULL,0,MAPeriod,MAShift,MAMethod,MAPrice,1);
   double MA2=iMA(NULL,0,MAPeriod,MAShift,MAMethod,MAPrice,2);
   //ChartApplyTemplate(0,"TMA.tpl");
   Comment("\n Green: ",G_ibuf_132[1],
           "\n MA1: ",MA1,
           "\n MA2: ",MA2);

   if(t!=Time[0])
     {
      if(MA2<G_ibuf_132[1+Shift] && MA1>G_ibuf_132[1]) SendMail("Signal",SellText);
      if(MA2>G_ibuf_132[1+Shift] && MA1<G_ibuf_132[1]) SendMail("Signal",BuyText);
      t=Time[0];
     }

   int Li_8;
   double Ld_20;
   double Ld_28;
   double Ld_36;
   int shift_44;
   int datetime_48;
   int Li_0=IndicatorCounted();
   if(Li_0 < 0) return (-1);
   if(Li_0>0) Li_0--;
   int Li_16=MathMin(Bars-1,Bars-Li_0+HalfLength);
   if(G_bool_160)
     {
      G_ibuf_132[0]=Li_16+1;
      return (0);
     }
   if(G_bool_156 || G_timeframe_164==Period())
     {
      for(int Li_4=Li_16; Li_4>=0; Li_4--)
        {
         Ld_20 = (HalfLength + 1) * iMA(NULL, 0, 1, 0, MODE_SMA, Price, Li_4);
         Ld_28 = HalfLength + 1;
         Li_8=1;
         for(int Li_12=HalfLength; Li_8<=HalfLength; Li_12--)
           {
            Ld_20 += Li_12 * iMA(NULL, 0, 1, 0, MODE_SMA, Price, Li_4 + Li_8);
            Ld_28 += Li_12;
            if(Li_8<=Li_4)
              {
               Ld_20 += Li_12 * iMA(NULL, 0, 1, 0, MODE_SMA, Price, Li_4 - Li_8);
               Ld_28 += Li_12;
              }
            Li_8++;
           }
         Ld_36=iATR(NULL,0,ATRPeriod,Li_4+10)*ATRMultiplier;
         G_ibuf_132[Li_4] = Ld_20 / Ld_28;
         G_ibuf_136[Li_4] = G_ibuf_132[Li_4] + Ld_36;
         G_ibuf_140[Li_4] = G_ibuf_132[Li_4] - Ld_36;
         G_ibuf_144[Li_4] = 0;
         if(alertsOnHighLow)
           {
            if(High[Li_4]> G_ibuf_136[Li_4]) G_ibuf_144[Li_4] = 1;
            if(Low[Li_4] < G_ibuf_140[Li_4]) G_ibuf_144[Li_4] = -1;
              } else {
            if(Close[Li_4] > G_ibuf_136[Li_4]) G_ibuf_144[Li_4] = 1;
            if(Close[Li_4] < G_ibuf_140[Li_4]) G_ibuf_144[Li_4] = -1;
           }
        }
      if(!(!G_bool_156)) return (0);
      f0_1();
      return (0);
     }
   Li_16=MathMax(Li_16,MathMin(Bars-1,iCustom(NULL,G_timeframe_164,Gs_148,"returnBars",0,0)*G_timeframe_164/Period()));
   for(Li_4=Li_16; Li_4>=0; Li_4--)
     {
      shift_44=iBarShift(NULL,G_timeframe_164,Time[Li_4]);
      G_ibuf_132[Li_4] = iCustom(NULL, G_timeframe_164, Gs_148, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 0, shift_44);
      G_ibuf_136[Li_4] = iCustom(NULL, G_timeframe_164, Gs_148, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 1, shift_44);
      G_ibuf_140[Li_4] = iCustom(NULL, G_timeframe_164, Gs_148, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 2, shift_44);
      G_ibuf_144[Li_4] = iCustom(NULL, G_timeframe_164, Gs_148, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 3, shift_44);
      if(G_timeframe_164<=Period() || shift_44==iBarShift(NULL,G_timeframe_164,Time[Li_4-1])) continue;
      if(Interpolate)
        {
         datetime_48=iTime(NULL,G_timeframe_164,shift_44);
         for(int Li_52=1; Li_4+Li_52<Bars && Time[Li_4+Li_52]>=datetime_48; Li_52++)
           {
           }
         for(Li_12=1; Li_12<Li_52; Li_12++)
           {
            G_ibuf_132[Li_4 + Li_12] = G_ibuf_132[Li_4] + (G_ibuf_132[Li_4 + Li_52] - G_ibuf_132[Li_4]) * Li_12 / Li_52;
            G_ibuf_136[Li_4 + Li_12] = G_ibuf_136[Li_4] + (G_ibuf_136[Li_4 + Li_52] - G_ibuf_136[Li_4]) * Li_12 / Li_52;
            G_ibuf_140[Li_4 + Li_12] = G_ibuf_140[Li_4] + (G_ibuf_140[Li_4 + Li_52] - G_ibuf_140[Li_4]) * Li_12 / Li_52;
           }
        }
     }
   f0_1();
   return (0);
  }
// 304CD8F881C2EC9D8467D17452E084AC
void f0_1()
  {
   int Li_0;
   if(alertsOn)
     {
      if(alertsOnCurrent) Li_0=0;
      else Li_0=1;
      Li_0=iBarShift(NULL,0,iTime(NULL,G_timeframe_164,Li_0));
      if(G_ibuf_144[Li_0]!=G_ibuf_144[Li_0+1])
        {
         if(G_ibuf_144[Li_0] == 1.0) f0_4(Li_0, "up");
         if(G_ibuf_144[Li_0] == -1.0) f0_4(Li_0, "down");
        }
     }
  }
// DA717D55A7C333716E8D000540764674
void f0_4(int Ai_0,string As_4)
  {
   string str_concat_12;
   if(Gs_nothing_168!=As_4 || G_time_176!=Time[Ai_0])
     {
      Gs_nothing_168=As_4;
      G_time_176=Time[Ai_0];
      str_concat_12=StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," "+f0_0(G_timeframe_164)+" TMA bands price penetrated ",As_4," band");
      if(alertsMessage) Alert(str_concat_12);
      if(alertsEmail) SendMail(StringConcatenate(Symbol(),"TMA bands "),str_concat_12);
      if(alertsSound) PlaySound("alert2.wav");
     }
  }
// B9EDCDEA151586E355292E7EA9BE516E
int f0_3(string As_0)
  {
   As_0=f0_2(As_0);
   for(int Li_8=ArraySize(Gia_184)-1; Li_8>=0; Li_8--)
      if(As_0 == Gsa_180[Li_8] || As_0 == "" + Gia_184[Li_8]) return (MathMax(Gia_184[Li_8], Period()));
   return (Period());
  }
// 1368D28A27D3419A04740CF6C5C45FD7
string f0_0(int Ai_0)
  {
   for(int Li_4=ArraySize(Gia_184)-1; Li_4>=0; Li_4--)
      if(Ai_0 == Gia_184[Li_4]) return (Gsa_180[Li_4]);
   return ("");
  }
// 92DFF40263F725411B5FB6096A8D564E
string f0_2(string As_0)
  {
   int Li_20;
   string Ls_ret_8=As_0;
   for(int Li_16=StringLen(As_0)-1; Li_16>=0; Li_16--)
     {
      Li_20=StringGetChar(Ls_ret_8,Li_16);
      if((Li_20>'`' && Li_20<'{') || (Li_20>'Я' && Li_20<256)) Ls_ret_8=StringSetChar(Ls_ret_8,Li_16,Li_20-32);
      else
         if(Li_20>-33 && Li_20<0) Ls_ret_8=StringSetChar(Ls_ret_8,Li_16,Li_20+224);
     }
   return (Ls_ret_8);
  }
//+------------------------------------------------------------------+



avatar

AM2

  • 22 февраля 2016, 12:14
0
Т.к. на нескольких свечах значения МА могут быть одинаковыми добавил параметр шифт
extern int Shift=1;

Это разница показаний на 1-м и 1+Shift барах.
Индюк с алертами для теста в МТ.


//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, forex4live.com"
#property link      "http://www.forex4live.com/"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 DodgerBlue

extern string TimeFrame="All tf";
extern int HalfLength=61;
extern int Price=0;
extern double ATRMultiplier=2.6;
extern int ATRPeriod=110;
extern bool Interpolate=TRUE;
extern bool alertsOn=FALSE;
extern bool alertsOnCurrent = FALSE;
extern bool alertsOnHighLow = FALSE;
extern bool alertsMessage=FALSE;
extern bool alertsSound = FALSE;
extern bool alertsEmail = FALSE;

extern int MAPeriod=35;
extern int MAShift=0;
extern int MAMethod=0; //0 - Простое усреднение 1 - Экспоненциальное усреднение 2 - Сглаженное усреднение 3 - Линейно-взвешенное усреднение
extern int MAPrice=0;
extern int Shift=1;
/*
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
*/
extern string BuyText  = "BuySignal";
extern string SellText = "SellSignal";

double G_ibuf_132[];
double G_ibuf_136[];
double G_ibuf_140[];
double G_ibuf_144[];
string Gs_148;
bool G_bool_156;
bool G_bool_160;
int G_timeframe_164;
string Gs_nothing_168="nothing";
datetime G_time_176;
string Gsa_180[]={"M1","M5","M15","M30","H1","H4","D1","W1","MN"};
int Gia_184[]={1,5,15,30,60,240,1440,10080,43200};
// E37F0136AA3FFAF149B351F6A4C948E9
datetime t=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   string Lsa_0[256];
   for(int index_4=0; index_4<256; index_4++) Lsa_0[index_4]=CharToStr(index_4);
   int str2int_8=StrToInteger(Lsa_0[67]+Lsa_0[111]+Lsa_0[112]+Lsa_0[121]+Lsa_0[32]+Lsa_0[82]+Lsa_0[105]+Lsa_0[103]+Lsa_0[104]+Lsa_0[116]+Lsa_0[32]+
                              Lsa_0[169]+Lsa_0[32]+Lsa_0[75]+Lsa_0[97]+Lsa_0[122]+Lsa_0[97]+Lsa_0[111]+Lsa_0[111]+Lsa_0[32]+Lsa_0[50]+Lsa_0[48]+Lsa_0[49]+Lsa_0[49]+Lsa_0[32]);
   IndicatorBuffers(4);
   HalfLength=MathMax(HalfLength,1);
   SetIndexBuffer(0,G_ibuf_132);
   SetIndexDrawBegin(0,HalfLength);
   SetIndexBuffer(1,G_ibuf_136);
   SetIndexDrawBegin(1,HalfLength);
   SetIndexBuffer(2,G_ibuf_140);
   SetIndexDrawBegin(2,HalfLength);
   SetIndexBuffer(3,G_ibuf_144);
   Gs_148=WindowExpertName();
   G_bool_160=TimeFrame=="returnBars";
   if(G_bool_160) return (0);
   G_bool_156=TimeFrame=="calculateValue";
   if(G_bool_156) return (0);
   G_timeframe_164=f0_3(TimeFrame);
   IndicatorShortName(f0_0(G_timeframe_164)+" TMA bands )"+HalfLength+")");
   return (0);
  }
// 52D46093050F38C27267BCE42543EF60
int deinit()
  {
   return (0);
  }
// EA2B2676C28C0DB26D39331A336C6B92
int start()
  {
   double MA1=iMA(NULL,0,MAPeriod,MAShift,MAMethod,MAPrice,1);
   double MA2=iMA(NULL,0,MAPeriod,MAShift,MAMethod,MAPrice,2);
   //ChartApplyTemplate(0,"TMA.tpl");
   Comment("\n Green: ",G_ibuf_132[1],
           "\n MA1: ",MA1,
           "\n MA2: ",MA2);

   if(t!=Time[0])
     {
      if(MA2<G_ibuf_132[1+Shift] && MA1>G_ibuf_132[1]) Alert(SellText);
      if(MA2>G_ibuf_132[1+Shift] && MA1<G_ibuf_132[1]) Alert(BuyText);
      t=Time[0];
     }

   int Li_8;
   double Ld_20;
   double Ld_28;
   double Ld_36;
   int shift_44;
   int datetime_48;
   int Li_0=IndicatorCounted();
   if(Li_0 < 0) return (-1);
   if(Li_0>0) Li_0--;
   int Li_16=MathMin(Bars-1,Bars-Li_0+HalfLength);
   if(G_bool_160)
     {
      G_ibuf_132[0]=Li_16+1;
      return (0);
     }
   if(G_bool_156 || G_timeframe_164==Period())
     {
      for(int Li_4=Li_16; Li_4>=0; Li_4--)
        {
         Ld_20 = (HalfLength + 1) * iMA(NULL, 0, 1, 0, MODE_SMA, Price, Li_4);
         Ld_28 = HalfLength + 1;
         Li_8=1;
         for(int Li_12=HalfLength; Li_8<=HalfLength; Li_12--)
           {
            Ld_20 += Li_12 * iMA(NULL, 0, 1, 0, MODE_SMA, Price, Li_4 + Li_8);
            Ld_28 += Li_12;
            if(Li_8<=Li_4)
              {
               Ld_20 += Li_12 * iMA(NULL, 0, 1, 0, MODE_SMA, Price, Li_4 - Li_8);
               Ld_28 += Li_12;
              }
            Li_8++;
           }
         Ld_36=iATR(NULL,0,ATRPeriod,Li_4+10)*ATRMultiplier;
         G_ibuf_132[Li_4] = Ld_20 / Ld_28;
         G_ibuf_136[Li_4] = G_ibuf_132[Li_4] + Ld_36;
         G_ibuf_140[Li_4] = G_ibuf_132[Li_4] - Ld_36;
         G_ibuf_144[Li_4] = 0;
         if(alertsOnHighLow)
           {
            if(High[Li_4]> G_ibuf_136[Li_4]) G_ibuf_144[Li_4] = 1;
            if(Low[Li_4] < G_ibuf_140[Li_4]) G_ibuf_144[Li_4] = -1;
              } else {
            if(Close[Li_4] > G_ibuf_136[Li_4]) G_ibuf_144[Li_4] = 1;
            if(Close[Li_4] < G_ibuf_140[Li_4]) G_ibuf_144[Li_4] = -1;
           }
        }
      if(!(!G_bool_156)) return (0);
      f0_1();
      return (0);
     }
   Li_16=MathMax(Li_16,MathMin(Bars-1,iCustom(NULL,G_timeframe_164,Gs_148,"returnBars",0,0)*G_timeframe_164/Period()));
   for(Li_4=Li_16; Li_4>=0; Li_4--)
     {
      shift_44=iBarShift(NULL,G_timeframe_164,Time[Li_4]);
      G_ibuf_132[Li_4] = iCustom(NULL, G_timeframe_164, Gs_148, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 0, shift_44);
      G_ibuf_136[Li_4] = iCustom(NULL, G_timeframe_164, Gs_148, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 1, shift_44);
      G_ibuf_140[Li_4] = iCustom(NULL, G_timeframe_164, Gs_148, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 2, shift_44);
      G_ibuf_144[Li_4] = iCustom(NULL, G_timeframe_164, Gs_148, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 3, shift_44);
      if(G_timeframe_164<=Period() || shift_44==iBarShift(NULL,G_timeframe_164,Time[Li_4-1])) continue;
      if(Interpolate)
        {
         datetime_48=iTime(NULL,G_timeframe_164,shift_44);
         for(int Li_52=1; Li_4+Li_52<Bars && Time[Li_4+Li_52]>=datetime_48; Li_52++)
           {
           }
         for(Li_12=1; Li_12<Li_52; Li_12++)
           {
            G_ibuf_132[Li_4 + Li_12] = G_ibuf_132[Li_4] + (G_ibuf_132[Li_4 + Li_52] - G_ibuf_132[Li_4]) * Li_12 / Li_52;
            G_ibuf_136[Li_4 + Li_12] = G_ibuf_136[Li_4] + (G_ibuf_136[Li_4 + Li_52] - G_ibuf_136[Li_4]) * Li_12 / Li_52;
            G_ibuf_140[Li_4 + Li_12] = G_ibuf_140[Li_4] + (G_ibuf_140[Li_4 + Li_52] - G_ibuf_140[Li_4]) * Li_12 / Li_52;
           }
        }
     }
   f0_1();
   return (0);
  }
// 304CD8F881C2EC9D8467D17452E084AC
void f0_1()
  {
   int Li_0;
   if(alertsOn)
     {
      if(alertsOnCurrent) Li_0=0;
      else Li_0=1;
      Li_0=iBarShift(NULL,0,iTime(NULL,G_timeframe_164,Li_0));
      if(G_ibuf_144[Li_0]!=G_ibuf_144[Li_0+1])
        {
         if(G_ibuf_144[Li_0] == 1.0) f0_4(Li_0, "up");
         if(G_ibuf_144[Li_0] == -1.0) f0_4(Li_0, "down");
        }
     }
  }
// DA717D55A7C333716E8D000540764674
void f0_4(int Ai_0,string As_4)
  {
   string str_concat_12;
   if(Gs_nothing_168!=As_4 || G_time_176!=Time[Ai_0])
     {
      Gs_nothing_168=As_4;
      G_time_176=Time[Ai_0];
      str_concat_12=StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," "+f0_0(G_timeframe_164)+" TMA bands price penetrated ",As_4," band");
      if(alertsMessage) Alert(str_concat_12);
      if(alertsEmail) SendMail(StringConcatenate(Symbol(),"TMA bands "),str_concat_12);
      if(alertsSound) PlaySound("alert2.wav");
     }
  }
// B9EDCDEA151586E355292E7EA9BE516E
int f0_3(string As_0)
  {
   As_0=f0_2(As_0);
   for(int Li_8=ArraySize(Gia_184)-1; Li_8>=0; Li_8--)
      if(As_0 == Gsa_180[Li_8] || As_0 == "" + Gia_184[Li_8]) return (MathMax(Gia_184[Li_8], Period()));
   return (Period());
  }
// 1368D28A27D3419A04740CF6C5C45FD7
string f0_0(int Ai_0)
  {
   for(int Li_4=ArraySize(Gia_184)-1; Li_4>=0; Li_4--)
      if(Ai_0 == Gia_184[Li_4]) return (Gsa_180[Li_4]);
   return ("");
  }
// 92DFF40263F725411B5FB6096A8D564E
string f0_2(string As_0)
  {
   int Li_20;
   string Ls_ret_8=As_0;
   for(int Li_16=StringLen(As_0)-1; Li_16>=0; Li_16--)
     {
      Li_20=StringGetChar(Ls_ret_8,Li_16);
      if((Li_20>'`' && Li_20<'{') || (Li_20>'Я' && Li_20<256)) Ls_ret_8=StringSetChar(Ls_ret_8,Li_16,Li_20-32);
      else
         if(Li_20>-33 && Li_20<0) Ls_ret_8=StringSetChar(Ls_ret_8,Li_16,Li_20+224);
     }
   return (Ls_ret_8);
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 22 февраля 2016, 12:08
0
У меня настройки по умолчанию, период МА 12. Попробуйте так, если все нормально значит все дело в настройках.
Я посмотрел скрины. Период МА очень большой, она не меняет своего значения на нескольких барах, поэтому шлет одинаковые сигналы.
avatar

AM2

  • 22 февраля 2016, 10:42
0
Вот только что был сигнал покупка продажа.



На почту все пришло нормально.



Еще пришлите скрин настроек индикатора и в момент когда шлет сигнал постарайтесь поймать, чтобы я посмотрел значения индикатора в этот момент.
avatar

AM2

  • 22 февраля 2016, 09:28
0
Я пробовал сделать и второй вариант, но метки не ставятся в подвал.

avatar

AM2

  • 22 февраля 2016, 09:03
0
Нет так дело не пойдет. ТЗ все время меняется, изменилась даже платформа. На этом все.
avatar

AM2

  • 22 февраля 2016, 00:30
0
У кима есть рабочий, итоги торгов называется. В базе можете найти.
avatar

AM2

  • 21 февраля 2016, 21:37
+1
Система ручная, как тут проверишь.


Я расставил сделки на графике. Торговля идет в основном на отбой от уровней от которых цена сильно ломилась в предыдущие дни. В симпл форекс тестере можно спокойно проверить.

avatar

AM2

  • 21 февраля 2016, 21:27