Вопросы по программированию в МТ4

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Вопросы по программированию в МТ4

Сообщение Kalkin » 05 фев 2017, 17:02

ВЯЧЕСЛАВПЕТРОВ писал(а):
YURIY007 писал(а):Почему не могут, два советника могут работать главное чтобы у них были разные магик исе будет работать вешал на одну пару даже три робота по разных тс, так как я не профи в програмировании, то написал советники по разным стратегиям , а обединить в один что-то не получается.

Что у меня не получается поставить два советника на одном графике поставить или я что то не понимаю?


AForex05.02.17.png


MT4, в отличие от MT5, не позволяет запустить на одном графике более одного советника. Для совместной работы нескольких советников придется открывать несколько графиков и на каждый из них вешать советник.
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 06 фев 2017, 08:03

Alexandeer писал(а):Как написать советника который будет работать сразу с несколькими парами? Желательно с ссылками на источники

Почитайте справку. Когда вы будет знать какие есть встроенные функции, вопрос отпадет.
Или задавайте более конкретные вопросы. Хотя могу подготовить материал на эту тему.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Вопросы по программированию в МТ4

Сообщение Haos » 06 фев 2017, 08:06

Alexandeer писал(а):Как написать советника который будет работать сразу с несколькими парами? Желательно с ссылками на источники

В МТ5. Мой один из последних так работает. Или же нужно исхитряться в 4-ке, выделяя ведущий актив, тот на котором сов стоит и ведомые.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 06 фев 2017, 08:06

tatarin писал(а):Помогите разобраться с буферами индикатора.
Нашел интересный гибридный стрелочник на 5 разных индикаторах, там 2 буфера.
Пробовал использовать его сигналы на известном шаблонном советнике exp_iCustom_v9_Martingale, которому надо указать номер буферов для покупки и продажи. Так вот, продажи проходят, а покупки - нет. Метод подбора не помог.
Для продажи используется буфер 0.

Вот кусок кода советника:
Код: выделить все
extern int        _O_M1_iBuyBufIndex         = 0;        // индекс буфера со стрелками на покупку
extern int        _O_M1_iSellBufIndex        = 1;        // индекс буфера со стрелками на продажу


А вот полный код индикатора:
Код: выделить все
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Gold
#property indicator_color2 Green

//extern
bool Allert=true;
bool Istoriy = true;
bool Rsi=true;
bool Cci_1=true;
bool Cci_2=true;
bool Stoh=true;
bool DIMI=true;
int Rasst_Arrow=10;
int Up_arrow=234;
int Down_arrow=233;
int Shift=1;
string comm1="Параметры RSI";
int Period_RSI=8;
int Primenit_k_RSI=0;
double RSI_lewel_UP=70;
double RSI_lewel_DOWN=30;
string comm2="Параметры CCI_1";
int CCI_1_period=14;
int CCI_1_primenit_k=0;

extern double CCI_UP=120;
extern  double CCI_DOWN=-120;
extern double DYMIL_UP=60;
extern double DYMIL_DOWN=40;

string comm3="Параметры CCI_2";
int CCI_2_period=7;
int CCI_2_primenit_k=0;

//extern 

string comm4="Параметры Stoh";
int Period_K=5;
int ZAmedlenie=2;
int Period_D=3;
int  Ceni    =0;
int Metod_MA=0;
double Stoh_UP=80;
double Stoh_DOWN=20;
string comm5="Параметры Dymi";
int stdevLength = 5;
int avgOfStdevLength = 10;
int DYMILength = 30;
int DYMILengthLowerLimit = 3;
int DYMILengthUpperLimit = 30;




int Gi_84 = 24;
bool Gi_88 = FALSE;
double G_ibuf_92[];
double G_ibuf_96[];


int G_bars_100 = 0;
int Bbars;
double RSI,CCI_1,CCI_2,STOH_m,STOH_s,Dymil;
int n,n1,n2,n3,n4,n5;
int m,m1,m2,m3,m4,m5;
string c;
// E37F0136AA3FFAF149B351F6A4C948E9
int init() {
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 3);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 3);
   
   SetIndexArrow(1, Down_arrow);
   SetIndexArrow(0, Up_arrow);

   SetIndexBuffer(0, G_ibuf_92);
   SetIndexBuffer(1, G_ibuf_96);
 
   G_bars_100 = Bars;
   return (0);
}


// EA2B2676C28C0DB26D39331A336C6B92
int start() {
   
   int Li_8 = IndicatorCounted();
   if (Li_8 < 0) return (-1);
   if (Li_8 > 0) Li_8--;
   int Li_12 = Bars - 1;
   if (Li_8 >= 1) Li_12 = Bars - Li_8 - 1;
   if (Li_12 < 0) Li_12 = 0;
   //Li_12=100;
   if(Istoriy==true)
   {
   for (int Li_16 = Li_12; Li_16 >= 0; Li_16--) {
   
   RSI=NormalizeDouble(iRSI(Symbol(),PERIOD_CURRENT,Period_RSI,Primenit_k_RSI,Li_16+Shift),4);
   CCI_1=NormalizeDouble(iCCI(Symbol(),PERIOD_CURRENT,CCI_1_period,CCI_1_primenit_k,Li_16+Shift),4);
   CCI_2=NormalizeDouble(iCCI(Symbol(),PERIOD_CURRENT,CCI_2_period,CCI_1_primenit_k,Li_16+Shift),4);
   STOH_m=NormalizeDouble(iStochastic(Symbol(),PERIOD_CURRENT,Period_K,Period_D,ZAmedlenie,Metod_MA,Ceni,0,Li_16+Shift),4);
   STOH_s=NormalizeDouble(iStochastic(Symbol(),PERIOD_CURRENT,Period_K,Period_D,ZAmedlenie,Metod_MA,Ceni,1,Li_16+Shift),4);
   Dymil=NormalizeDouble(iCustom(Symbol(),PERIOD_CURRENT,"DYMI",stdevLength,avgOfStdevLength,DYMILength,DYMILengthLowerLimit,DYMILengthUpperLimit,0,Li_16+Shift),4);
   if(Rsi)
   {if(RSI>RSI_lewel_UP)n1=1;else n1=0;
   }else n1=1;
 
  if(Cci_1)
  {if(CCI_1>CCI_UP)n2=1;else n2=0;
   }else n2=1;
  if(Cci_2)
  {if(CCI_2>CCI_UP)n3=1;else n3=0;
   }else n3=1;
   
  if(Stoh)
  {if(STOH_m>Stoh_UP&&STOH_s>Stoh_UP)n4=1;else n4=0;
   }else n4=1;
   
   if(DIMI)
   {if (Dymil>DYMIL_UP)n=1;else n=0;
   }else n=1;
 
    n5=n1*n2*n3*n4*n;
 
   if(n5>0 )
    {G_ibuf_92[Li_16] =Imaxx(Li_16)+Rasst_Arrow*Point;}
   
    //////////////////////////////////////////////////////////////////////////////////////////////////




if(Rsi)
   {if(RSI<RSI_lewel_DOWN)m1=1;else m1=0;
   }else m1=1;
if(Cci_1)
  {if(CCI_1<CCI_DOWN)m2=1;else m2=0;
   }else m2=1;
if(Cci_2)
  {if(CCI_2<CCI_DOWN)m3=1;else m3=0;
   }else m3=1;

 if(Stoh)
  {if(STOH_m<Stoh_DOWN&&STOH_s<Stoh_DOWN)m4=1;else m4=0;
   }else m4=1;

if(DIMI)
   {if (Dymil<DYMIL_DOWN)m=1;else m=0;
   }else m=1;
 
    m5=m1*m2*m3*m4*m;
 
   if(m5>0 )
    {G_ibuf_96[Li_16] =Iminn(Li_16)-Rasst_Arrow*Point;}
 
   
 




    //
   
   }
   }
   /////////////////////////////////////
   if(n5>0 )
    {G_ibuf_92[Li_16] =Imaxx(Li_16)+Rasst_Arrow*Point;
    c=Symbol()+" "+f0_0(Seconds())+"Sell!";
    if(Allert&&Bbars!=Bars){Alert(c);Bbars=Bars;}
    }
   
   if(m5>0 )
    {G_ibuf_96[Li_16] =Iminn(Li_16)-Rasst_Arrow*Point;
    c=Symbol()+" "+f0_0(Seconds())+"Buy!";
   if(Allert&&Bbars!=Bars){Alert(c);Bbars=Bars;}
   
   }
   
 
   
   
   
 
   return (0);
}

// 9B1AEE847CFB597942D106A4135D4FE6
int f0_1() {
   bool Li_ret_0 = FALSE;
   if (G_bars_100 != Bars) {
      Li_ret_0 = TRUE;
      G_bars_100 = Bars;
      Gi_88 = TRUE;
   }
   return (Li_ret_0);
}

// 945D754CB0DC06D04243FCBA25FC0802
string f0_0(int Ai_0) {
   if (Ai_0 == 60) return ("M1");
   if (Ai_0 == 300) return ("M5");
   if (Ai_0 == 900) return ("M15");
   if (Ai_0 == 1800) return ("M30");
   if (Ai_0 == 3600) return ("H1");
   if (Ai_0 == 14400) return ("H4");
   if (Ai_0 == 86400) return ("D1");
   if (Ai_0 == 604800) return ("W1");
   if (Ai_0 == 1619200) return ("MN1");
   return ("");
}

 double Imaxx(int Per)
   {double perr;
    perr = NormalizeDouble (iHigh(Symbol(),0,Per),Digits);
    return (perr);
   }
   //---Миниму--//
   double Iminn(int Per)
   {double perr;
    perr = NormalizeDouble (iLow(Symbol(),0,Per),Digits);
    return (perr);
   }
   //--Цена открытия--//
   double Cotkr(int Per)
   {double perr;
    perr = NormalizeDouble (iOpen(Symbol(),0,Per),Digits);
    return (perr);
    }
    //--Цена закрытия--//
    double Czakr(int Per)
   {double perr;
    perr = NormalizeDouble (iClose(Symbol(),0,Per),Digits);
    return (perr);
   }
   

Вот тут все понятно.
SetIndexArrow(1, Down_arrow);
SetIndexArrow(0, Up_arrow);
0 - вверх
1- вниз.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Вопросы по программированию в МТ4

Сообщение Lovkacher » 08 фев 2017, 04:01

А Вы могли бы разобрать код индикатора, который строит зоны спроса и предложения.Хотя бы пояснить, как так можно реализовать, чтобы зона спроса и предложения оканчивались в тот момент, когда свеча закрывается выше и ниже соответственно. Мне просто сам факт построения линий до пересечения с ценой интересен. Без помощи программиста не обойтись.
Если быть откровенным, моей целью является нахождение уровней, которые должны рисоваться на графике с таким условием, что когда уровень отрабатывается ценой определенным образом он либо заканчивается в том месте, где цена отработала его, либо остается не отработанным, если условие не совпало, то есть не заканчивается до того момента пока цена его не отработает


Код: выделить все
#property indicator_chart_window

extern int    CustomPeriod    = 0;        // In Minutes: 1, 5, 15, 30, 60, 240, 1440
extern int    MaxBars         = 500;      // Bars to be processed (to save CPU time)
extern double MinFactor       = 2;        // Minimum multiple of previous bar to cause a line
extern bool   Mail            = false;
extern string SoundFile       = "alert.wav";
extern color  ColLineLong     = Lime;
extern color  ColLineShort    = Red;
extern color  ColZoneLong     = Green;
extern color  ColZoneShort    = Maroon;
extern color  ColZoneLongOld  = 0x004000;
extern color  ColZoneShortOld = 0x000040;

int MaxLines = 2000;
double L[2000], S[2000];
double LM[2000], SM[2000];
datetime LT[2000], ST[2000];
int Trend;
double RealPoint;
string PeriodNice;

int init() {
  for(int i = 0; i < MaxLines; i++) {
    L[i] = 0;
    S[i] = 0;
    LM[i] = 0;
    SM[i] = 0;
  }
  Trend = 0;
  RealPoint = GetRealPoint();
  PeriodNice = GetPeriodNice(CustomPeriod);
  return(0);
}

int deinit() {
  for(int j = 0; j < MaxLines; j++) {
    ObjectDelete("ZS"+j+PeriodNice);
    ObjectDelete("ZSA"+j+PeriodNice);
    ObjectDelete("ZSB"+j+PeriodNice);
    ObjectDelete("ZL"+j+PeriodNice);
    ObjectDelete("ZLA"+j+PeriodNice);
    ObjectDelete("ZLB"+j+PeriodNice);
  }
  for(j = 0; j < Trend; j++) ObjectDelete("ZR"+j+PeriodNice);
  return(0);
}

double GetRealPoint() {
  switch (Digits) {
    case 3: return(0.01);
    case 5: return(0.0001);
  }
  return(Point);
}

string GetPeriodNice(int s) {
  if (s == 0) s = Period();
  if (s % 60 > 0) return("M"+s);
  s /= 60;
  if (s % 24 > 0) return("H"+s);
  s /= 24;
  if (s % 7 > 0) return("D"+s);
  return("W"+s);
}

double Ti(int s) {
  return(iTime(NULL, CustomPeriod, s));
}

double Op(int s) {
  return(iOpen(NULL, CustomPeriod, s));
}

double Cl(int s) {
  return(iClose(NULL, CustomPeriod, s));
}

string GetTimeDiffNice(int t) {
  t = Time[0] - t;
  if (t < 120) return(t+" seconds ago");
  t /= 60;
  if (t < 120) return(t+" minutes ago");
  t /= 60;
  if (t < 48) return(t+" hours ago");
  t /= 24;
  return(t+" days ago");
}

void DisplayAlert(string s) {
  if (SoundFile != "") PlaySound(SoundFile);
  Alert(s);
  Comment(TimeToStr(TimeCurrent(), TIME_MINUTES)+" "+s);
  if (Mail) SendMail(s, s);
}

int start() {
  static double old = 0;
  static datetime latestWicking = 0;
  if ((Time[0] > latestWicking) && (old > 0)) for(int j = 0; j < MaxLines; j++) {
    if ((S[j] > 0) && (Close[0] > S[j]) && (old <= S[j])) {
      DisplayAlert("Look for a "+Symbol()+" SHORT on "+PeriodNice+" (MightyZone)");
      latestWicking = Time[0];
      break;
    }
    if ((L[j] > 0) && (Close[0] < L[j]) && (old >= L[j])) {
      DisplayAlert("Look for a "+Symbol()+" LONG on "+PeriodNice+" (MightyZone)");
      latestWicking = Time[0];
      break;
    }
  }
  old = Close[0];

  static datetime latest = 0;
  int changed = Bars - IndicatorCounted();
  if (changed < 2) return(0);
 
  for(int i = MathMin(changed-1, MaxBars); i > 0; i--) {
    if (latest >= Ti(i)) continue;
    latest = Ti(i);

    for(j = 0; j < MaxLines; j++) {
      if ((L[j] > 0) && (Cl(i) <= LM[j])) {
        string n = "ZR"+Trend+PeriodNice;
        ObjectCreate(n, OBJ_RECTANGLE, 0, 0, 0);
        ObjectSet(n, OBJPROP_TIME1, LT[j]);
        ObjectSet(n, OBJPROP_PRICE1, L[j]);
        ObjectSet(n, OBJPROP_TIME2, Ti(i));
        ObjectSet(n, OBJPROP_PRICE2, LM[j]);
        ObjectSet(n, OBJPROP_COLOR, ColZoneLongOld);
        ObjectSet(n, OBJPROP_BACK, true);
        L[j] = 0;
        Trend++;
      }
      if ((S[j] > 0) && (Cl(i) >= SM[j])) {
        n = "ZR"+Trend+PeriodNice;
        ObjectCreate(n, OBJ_RECTANGLE, 0, 0, 0);
        ObjectSet(n, OBJPROP_TIME1, ST[j]);
        ObjectSet(n, OBJPROP_PRICE1, S[j]);
        ObjectSet(n, OBJPROP_TIME2, Ti(i));
        ObjectSet(n, OBJPROP_PRICE2, SM[j]);
        ObjectSet(n, OBJPROP_COLOR, ColZoneShortOld);
        ObjectSet(n, OBJPROP_BACK, true);
        S[j] = 0;
        Trend++;
      }
    }

    double r = MathAbs(Cl(i+1) - Cl(i+2)) * MinFactor;
    double h = (Cl(i+1) + Cl(i)) / 2;
    if (Cl(i) - Cl(i+1) > r) {
      for(j = 0; j < MaxLines; j++) {
        if (L[j] == h) break;
        if (L[j] != 0) continue;
        L[j] = h;
        LM[j] = MathMax(Op(i+1), Cl(i+1));
        LT[j] = Ti(i);
        break;
      }
    }
    if (Cl(i) - Cl(i+1) < -r) {
      for(j = 0; j < MaxLines; j++) {
        if (S[j] == h) break;
        if (S[j] != 0) continue;
        S[j] = h;
        SM[j] = MathMin(Op(i+1), Cl(i+1));
        ST[j] = Ti(i);
        break;
      }
    }
  }

  for(j = 0; j < MaxLines; j++) {
    n = "ZL"+j+PeriodNice;
    string na = "ZLA"+j+PeriodNice;
    string nb = "ZLB"+j+PeriodNice;

    if (L[j] == 0) {
      ObjectDelete(n);
      ObjectDelete(na);
      ObjectDelete(nb);
      continue;
    }

    ObjectCreate(n, OBJ_RECTANGLE, 0, 0, 0);
    ObjectSet(n, OBJPROP_COLOR, ColZoneLong);
    ObjectSet(n, OBJPROP_TIME1, LT[j]);
    ObjectSet(n, OBJPROP_PRICE1, L[j]);
    ObjectSet(n, OBJPROP_TIME2, D'01.01.2019');
    ObjectSet(n, OBJPROP_PRICE2, LM[j]);
   
    ObjectCreate(na, OBJ_FIBO, 0, 0, 0);
    ObjectSet(na, OBJPROP_FIBOLEVELS, 1);
    ObjectSet(na, OBJPROP_LEVELCOLOR, ColLineLong);
    ObjectSet(na, OBJPROP_TIME1, LT[j]);
    ObjectSet(na, OBJPROP_PRICE1, LM[j]);
    ObjectSet(na, OBJPROP_TIME2, Time[0]);
    ObjectSet(na, OBJPROP_PRICE2, LM[j]);
    ObjectSet(na, OBJPROP_BACK, true);
    ObjectSetFiboDescription(na, 0, PeriodNice+" "+GetTimeDiffNice(LT[j])+" "+DoubleToStr(LM[j], Digits));
   
    ObjectCreate(nb, OBJ_FIBO, 0, 0, 0);
    ObjectSet(nb, OBJPROP_FIBOLEVELS, 1);
    ObjectSet(nb, OBJPROP_LEVELCOLOR, ColLineLong);
    ObjectSet(nb, OBJPROP_TIME1, LT[j]);
    ObjectSet(nb, OBJPROP_PRICE1, L[j]);
    ObjectSet(nb, OBJPROP_TIME2, Time[0]);
    ObjectSet(nb, OBJPROP_PRICE2, L[j]);
    ObjectSet(nb, OBJPROP_BACK, true);
    ObjectSetFiboDescription(nb, 0, DoubleToStr((L[j]-LM[j])/RealPoint, 0)+" pips above: "+DoubleToStr(L[j], Digits));
  }

  for(j = 0; j < MaxLines; j++) {
    n = "ZS"+j+PeriodNice;
    na = "ZSA"+j+PeriodNice;
    nb = "ZSB"+j+PeriodNice;

    if (S[j] == 0) {
      ObjectDelete(n);
      ObjectDelete(na);
      ObjectDelete(nb);
      continue;
    }

    ObjectCreate(n, OBJ_RECTANGLE, 0, 0, 0);
    ObjectSet(n, OBJPROP_COLOR, ColZoneShort);
    ObjectSet(n, OBJPROP_TIME1, ST[j]);
    ObjectSet(n, OBJPROP_PRICE1, S[j]);
    ObjectSet(n, OBJPROP_TIME2, D'01.01.2019');
    ObjectSet(n, OBJPROP_PRICE2, SM[j]);

    ObjectCreate(na, OBJ_FIBO, 0, 0, 0);
    ObjectSet(na, OBJPROP_FIBOLEVELS, 1);
    ObjectSet(na, OBJPROP_LEVELCOLOR, ColLineShort);
    ObjectSet(na, OBJPROP_TIME1, ST[j]);
    ObjectSet(na, OBJPROP_PRICE1, SM[j]);
    ObjectSet(na, OBJPROP_TIME2, Time[0]);
    ObjectSet(na, OBJPROP_PRICE2, SM[j]);
    ObjectSet(na, OBJPROP_BACK, true);
    ObjectSetFiboDescription(na, 0, PeriodNice+" "+GetTimeDiffNice(ST[j])+" "+DoubleToStr(SM[j], Digits));

    ObjectCreate(nb, OBJ_FIBO, 0, 0, 0);
    ObjectSet(nb, OBJPROP_FIBOLEVELS, 1);
    ObjectSet(nb, OBJPROP_LEVELCOLOR, ColLineShort);
    ObjectSet(nb, OBJPROP_TIME1, ST[j]);
    ObjectSet(nb, OBJPROP_PRICE1, S[j]);
    ObjectSet(nb, OBJPROP_TIME2, Time[0]);
    ObjectSet(nb, OBJPROP_PRICE2, S[j]);
    ObjectSet(nb, OBJPROP_BACK, true);
    ObjectSetFiboDescription(nb, 0, DoubleToStr((SM[j]-S[j])/RealPoint, 0)+" pips below: "+DoubleToStr(S[j], Digits));
  }

  return(0);
}

Аватар пользователя
Lovkacher
 
Сообщений: 3
Зарегистрирован: 02 сен 2016, 09:42
Средств на руках: 1.60 Доллар
Группа: Новые пользователи
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Вопросы по программированию в МТ4

Сообщение Alexandeer » 08 фев 2017, 04:53

Скажите, пожалуйста, что нужно гуглить, или дайте ссылки на инфу, мне нужно научиться писать бота, который будет работать или не работать на определенных типах счета, например, чтобы только на демо-счете или Памм-счете. Наверное это можно как-то узнать и сделать условие
if (демка) return 0; Но вот памм определить, наверно, сложнее, но 100% можно.
Аватар пользователя
Alexandeer
 
Сообщений: 17
Зарегистрирован: 04 ноя 2016, 04:54
Средств на руках: 8.00 Доллар
Группа: Новые пользователи
Благодарил (а): 18 раз.
Поблагодарили: 0 раз.

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 08 фев 2017, 06:28

ПАММ нельзя определить.
Вот что можно:
AccountInfoInteger

Возвращает значение соответствующего свойства счета.



long AccountInfoInteger(
int property_id // идентификатор свойства
);


Параметры

property_id

[in] Идентификатор свойства. Значение может быть одним из значений ENUM_ACCOUNT_INFO_INTEGER.

Возвращаемое значение

Значение типа long.

Примечание

Свойство должно быть одного из типов bool, int или long.


ACCOUNT_TRADE_MODE_DEMO

Демонстрационный торговый счет


ACCOUNT_TRADE_MODE_CONTEST

Конкурсный торговый счет


ACCOUNT_TRADE_MODE_REAL

Реальный торговый счет
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 08 фев 2017, 06:29

В коде разобраться не могу. Я плохо понимаю чужой код.
Может кто другой подскажет.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Вопросы по программированию в МТ4

Сообщение Lovkacher » 08 фев 2017, 08:42

Рэндом писал(а):В коде разобраться не могу. Я плохо понимаю чужой код.
Может кто другой подскажет.

Может кто подскажет?
Lovkacher писал(а):А Вы могли бы разобрать код индикатора, который строит зоны спроса и предложения.Хотя бы пояснить, как так можно реализовать, чтобы зона спроса и предложения оканчивались в тот момент, когда свеча закрывается выше и ниже соответственно. Мне просто сам факт построения линий до пересечения с ценой интересен. Без помощи программиста не обойтись.
Если быть откровенным, моей целью является нахождение уровней, которые должны рисоваться на графике с таким условием, что когда уровень отрабатывается ценой определенным образом он либо заканчивается в том месте, где цена отработала его, либо остается не отработанным, если условие не совпало, то есть не заканчивается до того момента пока цена его не отработает


Код: выделить все
#property indicator_chart_window

extern int    CustomPeriod    = 0;        // In Minutes: 1, 5, 15, 30, 60, 240, 1440
extern int    MaxBars         = 500;      // Bars to be processed (to save CPU time)
extern double MinFactor       = 2;        // Minimum multiple of previous bar to cause a line
extern bool   Mail            = false;
extern string SoundFile       = "alert.wav";
extern color  ColLineLong     = Lime;
extern color  ColLineShort    = Red;
extern color  ColZoneLong     = Green;
extern color  ColZoneShort    = Maroon;
extern color  ColZoneLongOld  = 0x004000;
extern color  ColZoneShortOld = 0x000040;

int MaxLines = 2000;
double L[2000], S[2000];
double LM[2000], SM[2000];
datetime LT[2000], ST[2000];
int Trend;
double RealPoint;
string PeriodNice;

int init() {
  for(int i = 0; i < MaxLines; i++) {
    L[i] = 0;
    S[i] = 0;
    LM[i] = 0;
    SM[i] = 0;
  }
  Trend = 0;
  RealPoint = GetRealPoint();
  PeriodNice = GetPeriodNice(CustomPeriod);
  return(0);
}

int deinit() {
  for(int j = 0; j < MaxLines; j++) {
    ObjectDelete("ZS"+j+PeriodNice);
    ObjectDelete("ZSA"+j+PeriodNice);
    ObjectDelete("ZSB"+j+PeriodNice);
    ObjectDelete("ZL"+j+PeriodNice);
    ObjectDelete("ZLA"+j+PeriodNice);
    ObjectDelete("ZLB"+j+PeriodNice);
  }
  for(j = 0; j < Trend; j++) ObjectDelete("ZR"+j+PeriodNice);
  return(0);
}

double GetRealPoint() {
  switch (Digits) {
    case 3: return(0.01);
    case 5: return(0.0001);
  }
  return(Point);
}

string GetPeriodNice(int s) {
  if (s == 0) s = Period();
  if (s % 60 > 0) return("M"+s);
  s /= 60;
  if (s % 24 > 0) return("H"+s);
  s /= 24;
  if (s % 7 > 0) return("D"+s);
  return("W"+s);
}

double Ti(int s) {
  return(iTime(NULL, CustomPeriod, s));
}

double Op(int s) {
  return(iOpen(NULL, CustomPeriod, s));
}

double Cl(int s) {
  return(iClose(NULL, CustomPeriod, s));
}

string GetTimeDiffNice(int t) {
  t = Time[0] - t;
  if (t < 120) return(t+" seconds ago");
  t /= 60;
  if (t < 120) return(t+" minutes ago");
  t /= 60;
  if (t < 48) return(t+" hours ago");
  t /= 24;
  return(t+" days ago");
}

void DisplayAlert(string s) {
  if (SoundFile != "") PlaySound(SoundFile);
  Alert(s);
  Comment(TimeToStr(TimeCurrent(), TIME_MINUTES)+" "+s);
  if (Mail) SendMail(s, s);
}

int start() {
  static double old = 0;
  static datetime latestWicking = 0;
  if ((Time[0] > latestWicking) && (old > 0)) for(int j = 0; j < MaxLines; j++) {
    if ((S[j] > 0) && (Close[0] > S[j]) && (old <= S[j])) {
      DisplayAlert("Look for a "+Symbol()+" SHORT on "+PeriodNice+" (MightyZone)");
      latestWicking = Time[0];
      break;
    }
    if ((L[j] > 0) && (Close[0] < L[j]) && (old >= L[j])) {
      DisplayAlert("Look for a "+Symbol()+" LONG on "+PeriodNice+" (MightyZone)");
      latestWicking = Time[0];
      break;
    }
  }
  old = Close[0];

  static datetime latest = 0;
  int changed = Bars - IndicatorCounted();
  if (changed < 2) return(0);
 
  for(int i = MathMin(changed-1, MaxBars); i > 0; i--) {
    if (latest >= Ti(i)) continue;
    latest = Ti(i);

    for(j = 0; j < MaxLines; j++) {
      if ((L[j] > 0) && (Cl(i) <= LM[j])) {
        string n = "ZR"+Trend+PeriodNice;
        ObjectCreate(n, OBJ_RECTANGLE, 0, 0, 0);
        ObjectSet(n, OBJPROP_TIME1, LT[j]);
        ObjectSet(n, OBJPROP_PRICE1, L[j]);
        ObjectSet(n, OBJPROP_TIME2, Ti(i));
        ObjectSet(n, OBJPROP_PRICE2, LM[j]);
        ObjectSet(n, OBJPROP_COLOR, ColZoneLongOld);
        ObjectSet(n, OBJPROP_BACK, true);
        L[j] = 0;
        Trend++;
      }
      if ((S[j] > 0) && (Cl(i) >= SM[j])) {
        n = "ZR"+Trend+PeriodNice;
        ObjectCreate(n, OBJ_RECTANGLE, 0, 0, 0);
        ObjectSet(n, OBJPROP_TIME1, ST[j]);
        ObjectSet(n, OBJPROP_PRICE1, S[j]);
        ObjectSet(n, OBJPROP_TIME2, Ti(i));
        ObjectSet(n, OBJPROP_PRICE2, SM[j]);
        ObjectSet(n, OBJPROP_COLOR, ColZoneShortOld);
        ObjectSet(n, OBJPROP_BACK, true);
        S[j] = 0;
        Trend++;
      }
    }

    double r = MathAbs(Cl(i+1) - Cl(i+2)) * MinFactor;
    double h = (Cl(i+1) + Cl(i)) / 2;
    if (Cl(i) - Cl(i+1) > r) {
      for(j = 0; j < MaxLines; j++) {
        if (L[j] == h) break;
        if (L[j] != 0) continue;
        L[j] = h;
        LM[j] = MathMax(Op(i+1), Cl(i+1));
        LT[j] = Ti(i);
        break;
      }
    }
    if (Cl(i) - Cl(i+1) < -r) {
      for(j = 0; j < MaxLines; j++) {
        if (S[j] == h) break;
        if (S[j] != 0) continue;
        S[j] = h;
        SM[j] = MathMin(Op(i+1), Cl(i+1));
        ST[j] = Ti(i);
        break;
      }
    }
  }

  for(j = 0; j < MaxLines; j++) {
    n = "ZL"+j+PeriodNice;
    string na = "ZLA"+j+PeriodNice;
    string nb = "ZLB"+j+PeriodNice;

    if (L[j] == 0) {
      ObjectDelete(n);
      ObjectDelete(na);
      ObjectDelete(nb);
      continue;
    }

    ObjectCreate(n, OBJ_RECTANGLE, 0, 0, 0);
    ObjectSet(n, OBJPROP_COLOR, ColZoneLong);
    ObjectSet(n, OBJPROP_TIME1, LT[j]);
    ObjectSet(n, OBJPROP_PRICE1, L[j]);
    ObjectSet(n, OBJPROP_TIME2, D'01.01.2019');
    ObjectSet(n, OBJPROP_PRICE2, LM[j]);
   
    ObjectCreate(na, OBJ_FIBO, 0, 0, 0);
    ObjectSet(na, OBJPROP_FIBOLEVELS, 1);
    ObjectSet(na, OBJPROP_LEVELCOLOR, ColLineLong);
    ObjectSet(na, OBJPROP_TIME1, LT[j]);
    ObjectSet(na, OBJPROP_PRICE1, LM[j]);
    ObjectSet(na, OBJPROP_TIME2, Time[0]);
    ObjectSet(na, OBJPROP_PRICE2, LM[j]);
    ObjectSet(na, OBJPROP_BACK, true);
    ObjectSetFiboDescription(na, 0, PeriodNice+" "+GetTimeDiffNice(LT[j])+" "+DoubleToStr(LM[j], Digits));
   
    ObjectCreate(nb, OBJ_FIBO, 0, 0, 0);
    ObjectSet(nb, OBJPROP_FIBOLEVELS, 1);
    ObjectSet(nb, OBJPROP_LEVELCOLOR, ColLineLong);
    ObjectSet(nb, OBJPROP_TIME1, LT[j]);
    ObjectSet(nb, OBJPROP_PRICE1, L[j]);
    ObjectSet(nb, OBJPROP_TIME2, Time[0]);
    ObjectSet(nb, OBJPROP_PRICE2, L[j]);
    ObjectSet(nb, OBJPROP_BACK, true);
    ObjectSetFiboDescription(nb, 0, DoubleToStr((L[j]-LM[j])/RealPoint, 0)+" pips above: "+DoubleToStr(L[j], Digits));
  }

  for(j = 0; j < MaxLines; j++) {
    n = "ZS"+j+PeriodNice;
    na = "ZSA"+j+PeriodNice;
    nb = "ZSB"+j+PeriodNice;

    if (S[j] == 0) {
      ObjectDelete(n);
      ObjectDelete(na);
      ObjectDelete(nb);
      continue;
    }

    ObjectCreate(n, OBJ_RECTANGLE, 0, 0, 0);
    ObjectSet(n, OBJPROP_COLOR, ColZoneShort);
    ObjectSet(n, OBJPROP_TIME1, ST[j]);
    ObjectSet(n, OBJPROP_PRICE1, S[j]);
    ObjectSet(n, OBJPROP_TIME2, D'01.01.2019');
    ObjectSet(n, OBJPROP_PRICE2, SM[j]);

    ObjectCreate(na, OBJ_FIBO, 0, 0, 0);
    ObjectSet(na, OBJPROP_FIBOLEVELS, 1);
    ObjectSet(na, OBJPROP_LEVELCOLOR, ColLineShort);
    ObjectSet(na, OBJPROP_TIME1, ST[j]);
    ObjectSet(na, OBJPROP_PRICE1, SM[j]);
    ObjectSet(na, OBJPROP_TIME2, Time[0]);
    ObjectSet(na, OBJPROP_PRICE2, SM[j]);
    ObjectSet(na, OBJPROP_BACK, true);
    ObjectSetFiboDescription(na, 0, PeriodNice+" "+GetTimeDiffNice(ST[j])+" "+DoubleToStr(SM[j], Digits));

    ObjectCreate(nb, OBJ_FIBO, 0, 0, 0);
    ObjectSet(nb, OBJPROP_FIBOLEVELS, 1);
    ObjectSet(nb, OBJPROP_LEVELCOLOR, ColLineShort);
    ObjectSet(nb, OBJPROP_TIME1, ST[j]);
    ObjectSet(nb, OBJPROP_PRICE1, S[j]);
    ObjectSet(nb, OBJPROP_TIME2, Time[0]);
    ObjectSet(nb, OBJPROP_PRICE2, S[j]);
    ObjectSet(nb, OBJPROP_BACK, true);
    ObjectSetFiboDescription(nb, 0, DoubleToStr((SM[j]-S[j])/RealPoint, 0)+" pips below: "+DoubleToStr(S[j], Digits));
  }

  return(0);
}

Последний раз редактировалось Рэндом 08 фев 2017, 12:31, всего редактировалось 1 раз.
Причина: .
Аватар пользователя
Lovkacher
 
Сообщений: 3
Зарегистрирован: 02 сен 2016, 09:42
Средств на руках: 1.60 Доллар
Группа: Новые пользователи
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Вопросы по программированию в МТ4

Сообщение Kalkin » 09 фев 2017, 17:52

Lovkacher писал(а):А Вы могли бы разобрать код индикатора, который строит зоны спроса и предложения.Хотя бы пояснить, как так можно реализовать, чтобы зона спроса и предложения оканчивались в тот момент, когда свеча закрывается выше и ниже соответственно.

Как я вижу, индикатор сейчас так и работает. Как свеча закрылась ниже/выше зоны - зона на этой свече заканчивается. Текущая свеча не учитывается, ожидается закрытие.
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron