Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Добрый день,  подзабыл за 2 года вплотную mql4( объясните пожалуйста  почему алерт не работает

#property copyright "Copyright © 2013"
#property link      "http://www.google.com"

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Green
#property indicator_color4 Red

extern int FastEMA = 12;
extern int SlowEMA = 26;
extern int SignalEMA = 9;
extern int       SoundON=1;                        // 0 = false    1 = true
static datetime lastbar;
bool NewBar;
double g_ibuf_88[];
double g_ibuf_92[];
double g_ibuf_96[];
double g_ibuf_100[];

int init() {
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS) + 1.0);
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID);
   SetIndexBuffer(0, g_ibuf_88);
   SetIndexDrawBegin(0, SlowEMA);
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID);
   SetIndexBuffer(1, g_ibuf_92);
   SetIndexDrawBegin(1, SignalEMA);
   SetIndexStyle(2, DRAW_HISTOGRAM, STYLE_SOLID);
   SetIndexBuffer(2, g_ibuf_96);
   SetIndexStyle(3, DRAW_HISTOGRAM, STYLE_SOLID);
   SetIndexBuffer(3, g_ibuf_100);
   IndicatorShortName("MACD(" + FastEMA + "," + SlowEMA + "," + SignalEMA + ")");
   SetIndexLabel(0, "MACD");
   SetIndexLabel(1, "Signal");
   SetIndexLabel(2, "HistogramUP");
   SetIndexLabel(3, "HistogramDOWN");
   return (0);
}

int start() {
   double ld_4;
   int li_12 = IndicatorCounted();
   if (li_12 < 0) return (-1);
   if (li_12 > 0) li_12--;
   int li_0 = Bars - li_12;
   for (int li_16 = 0; li_16 < li_0; li_16++) g_ibuf_88[li_16] = iMA(NULL, 0, FastEMA, 0, MODE_EMA, PRICE_CLOSE, li_16) - iMA(NULL, 0, SlowEMA, 0, MODE_EMA, PRICE_CLOSE, li_16);
   for (li_16 = 0; li_16 < li_0; li_16++) g_ibuf_92[li_16] = iMAOnArray(g_ibuf_88, Bars, SignalEMA, 0, MODE_EMA, li_16);
   for (li_16 = 0; li_16 < li_0; li_16++) {
      g_ibuf_96[li_16] = 0;
      g_ibuf_100[li_16] = 0;
      ld_4 = g_ibuf_88[li_16] - g_ibuf_92[li_16];
      if (ld_4 >= 0.0) g_ibuf_96[li_16] = ld_4;
      else g_ibuf_100[li_16] = ld_4;
   }
   return (0);
       bool NewBar=isNewBar();
    if (SoundON==1 && g_ibuf_96[1] != 0 &&  g_ibuf_100[2] != 0 && NewBar)
    {
     PlaySound("alert..wav");
    }
    if (SoundON==1 && g_ibuf_100[1] != 0 && g_ibuf_96[2] != 0 && NewBar) 
    {
     PlaySound("alert.wav");
    }
    return(0); 
}
bool isNewBar()
{
  
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
}  

MACD 2Line.mq4

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
21 минуту назад, d1w4m3 сказал:

( объясните пожалуйста  почему алерт не работает

int start() 
{
   double ld_4;
   int li_12 = IndicatorCounted();
   if (li_12 < 0) return (-1);
   if (li_12 > 0) li_12--;
   int li_0 = Bars - li_12;
   
   for (int li_16 = 0; li_16 < li_0; li_16++) 
      g_ibuf_88[li_16] = iMA(NULL, 0, FastEMA, 0, MODE_EMA, PRICE_CLOSE, li_16) - iMA(NULL, 0, SlowEMA, 0, MODE_EMA, PRICE_CLOSE, li_16);
   
   for (li_16 = 0; li_16 < li_0; li_16++) 
      g_ibuf_92[li_16] = iMAOnArray(g_ibuf_88, Bars, SignalEMA, 0, MODE_EMA, li_16);
   
   for (li_16 = 0; li_16 < li_0; li_16++) 
   {
      g_ibuf_96[li_16] = 0;
      g_ibuf_100[li_16] = 0;
      ld_4 = g_ibuf_88[li_16] - g_ibuf_92[li_16];
      if (ld_4 >= 0.0) g_ibuf_96[li_16] = ld_4;
      else g_ibuf_100[li_16] = ld_4;
   }
   return (0); // здесь всегда происходит предывание функции start()
   
    bool NewBar=isNewBar();
     
    if (SoundON==1 && g_ibuf_96[1] != 0 &&  g_ibuf_100[2] != 0 && NewBar)
    {
     PlaySound("alert..wav");
    }
    if (SoundON==1 && g_ibuf_100[1] != 0 && g_ibuf_96[2] != 0 && NewBar) 
    {
     PlaySound("alert.wav");
    }
    return(0); 
}

Ошибка выделена комментарием
п.с.
1. код нужно оформлять через тэги код:
image.png.f4633097d7449555205b55927d36c6d8.png


2. у Вас переменная bool NewBar объявлена на глобальном уровне и на локальном.
3. Самого не напрягает разбираться с декомпилированным кодом, где переменные обозваны абы как?

  • Спасибо 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Спасибо, это все от невнимательности, просто опять решил залезть в код, с нес винду и забыл скопировать все наработки( еще раз спасибо

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
6 минут назад, d1w4m3 сказал:

Спасибо, это все от невнимательности,

"А для этого у нас есть багор и ведро с песком"(с) День радио
image.png.d66855379750c0a7748ec11857675daf.png

  • Лол 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Помогите разобраться:

 

#property copyright "My"
#property link      "https://www"
#property version   "1.00"
#property strict

struct Sign {
int         Period_MA;
double   Step;
double   Delta;
};

Sign Signal[15];

input Sign Signal[1].Period_MA = 150;
input Sign Signal[1].Step         = 10;
input Sign Signal[1].Delta        = 20;

input Sign Signal[2].Period_MA = 300; и т.д.

 

Объявляю структуру Sign, затем массив Signal с типом Sign. Данный массив надо заполнить вручную при запуске советника.

При компиляции выдает ошибку: '.'  - semicolon expected, на строках, где идет присвоение input Sign Signal[1].Period_MA = 150; и т.д.

 

Если делаю так:

input int       Period_MA1 = 150;
input double Step1          = 10;
input double Delta1         = 20;

input int       Period_MA2 = 300;


А затем в функцииOnInit():

 Signal[1].Period_MA = Period_MA1;

 Signal[1].Step = Step1;  и т.д.

 

То все работает, ошибок нет. Как можно не используя лишних переменных, присвоить значения массиву Signal?


 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, VitChel сказал:

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

можете в OnInit() непосредственно задать значения всех переменных массива.
А если все таки нужно в input- переменных задавать, то попробуйте объявить три переменные, типа:
input string MA_period = "150,300,.....";

Далее в OnInit() через функцию StringSplit()  преобразовать строку в массив значений. 
И в цикле заполнить массив структур

  • Спасибо 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем доброго времени!

Вопрос, функция OrdersTotal() возвращает кол-во открытых и отложенных ордеров у конкретной валютной пары? Или же если один и тот же советник на одном счете торгует несколькими парами, то зацепятся все ордера суммарно этой функцией? И так и так работает?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
3 часа назад, diodio сказал:

Вопрос, функция OrdersTotal() возвращает кол-во открытых и отложенных ордеров у конкретной валютной пары? 

ХЕЛП:

Цитата

OrdersTotal

Возвращает общее количество открытых и отложенных ордеров.

int  OrdersTotal();

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

Общее количество открытых и отложенных ордеров.

какое место из справки вызывает сомнение?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Как сделать так, чтобы и в тесте можно было прогнать и на графике посмотреть? В данный момент Close All в тесте не работает 

80C5EC89-E785-4E2B-9A19-FDF2C05C84C4.jpeg

AA204191-54A0-47F3-B5B1-D1B60BBD26E4.png

6BCA22D9-9C0E-401B-AAAD-6370EE68A7E4.png

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   //--- обработка нажатия кнопки "CLOSE ALL"
   if(sparam=="CLOSE_ALL")
      {
      Sleep(50);
      //--- удаление графических объектов
      ObjectDelete(0,"CLOSE_ALL");
      //--- создание графических объектов
      CreateButton("CLOSE_YES",156,17,30,20,ColorYES,BORDER_RAISED,"YES",
                  "Arial",8,clrBlack,CORNER_LEFT_UPPER,false,false,false,true,1,false);
      //----
      CreateButton("CLOSE_NO",187,17,30,20,ColorNO,BORDER_RAISED,"NO",
                  "Arial",8,clrBlack,CORNER_LEFT_UPPER,false,false,false,true,1,false);
      //----
      return;
      }
   //--- обработка кнопки завершена
   //--- обработка нажатия кнопки "CLOSE NO"
   if(sparam=="CLOSE_NO")
      {
      Sleep(50);
      //--- удаление графических объектов
      ObjectDelete(0,"CLOSE_YES");
      ObjectDelete(0,"CLOSE_NO");
      //--- создание графических объектов
      CreateButton("CLOSE_ALL",156,17,61,20,ButtonColorBack,BORDER_RAISED,"Close All",
                  "Arial",8,ButtonColorText,CORNER_LEFT_UPPER,false,false,false,true,1,false);
      //----
      return;
      }
   //--- обработка кнопки завершена
   //--- обработка кнопки удаления/закрытия всех ордеров
   if(sparam=="CLOSE_YES")
      {
      Sleep(50);
      //--- удаление графических объектов
      ObjectDelete(0,"CLOSE_YES");
      ObjectDelete(0,"CLOSE_NO");
      //--- создание графических объектов
      CreateButton("CLOSE_ALL",156,17,61,20,ButtonColorBack,BORDER_RAISED,"Close All",
                  "Arial",8,ButtonColorText,CORNER_LEFT_UPPER,false,false,false,true,1,false);
      //--- удаление и закрытие ордеров
      while(true)
         {
         bool find_order=false;
         int slipp;
         //----
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)==true)
         if(OrderSymbol()==_Symbol)
            {
            find_order=true;
            //----
            if(OrderType()==OP_BUY)
               {
               RefreshRates(); slipp=(int)(((Ask-Bid)/Point)*2);
               if(OrderClose(OrderTicket(),OrderLots(),Bid,slipp,clrBlue)==false){}
               }
            //----
            if(OrderType()==OP_SELL)
               {
               RefreshRates(); slipp=(int)(((Ask-Bid)/Point)*2);
               if(OrderClose(OrderTicket(),OrderLots(),Ask,slipp,clrRed)==false){}
               }
            //----
            if(OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT)
            if(OrderDelete(OrderTicket(),clrRed)==false){}
            //----
            if(OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT)
            if(OrderDelete(OrderTicket(),clrBlue)==false){}
            }
            if(find_order==false)
            {
            Alert("Все ордера закрыты!");break;
            }
         } 
      }
   //--- обработка кнопки завершена
//----
  }
//+------------------------------------------------------------------+
//| Создает объект кнопка                                            |
//+------------------------------------------------------------------+
void CreateButton(string name,int xd,int yd,int xs,int ys,color color_back,
                  ENUM_BORDER_TYPE border_type,string text,string font,
                  int font_size,color color_text,int corner,bool back,
                  bool selectable,bool selected,bool hidden,int zorder,bool state)
   {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,xd);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,yd);
   ObjectSetInteger(0,name,OBJPROP_XSIZE,xs);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,ys);
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,color_back);
   ObjectSetInteger(0,name,OBJPROP_BORDER_TYPE,border_type);
   ObjectSetString(0,name,OBJPROP_TEXT,text);
   ObjectSetString(0,name,OBJPROP_FONT,font);
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,font_size);
   ObjectSetInteger(0,name,OBJPROP_COLOR,color_text);
   ObjectSetInteger(0,name,OBJPROP_CORNER,corner);
   ObjectSetInteger(0,name,OBJPROP_BACK,back);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,selectable);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,selected);
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,hidden);
   ObjectSetInteger(0,name,OBJPROP_ZORDER,zorder);
   ObjectSetInteger(0,name,OBJPROP_STATE,state);
   Loop
сама кнопка

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
20 часов назад, usver73 сказал:

какое место из справки вызывает сомнение?

Счет один, пары разные, вот в чем сомнение. По всем парам возвращает общее кол-во? На каждую пару стоит один и тот же советник и в нем присутствует эта функция. Так вот вопрос, эта функция вернет общее кол-во позиций по одному счету или для каждой пары будет возвращено то кол-во которое открыто на данной паре?

Изменено пользователем diodio
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Только что, diodio сказал:

По всем парам возвращает общее кол-во?

ведь в справке не оговорено про пары?
Значит все ордера в рынке.
Ведь в функции подсчета "своих" ордеров советника практически всегда откидываем ордера "чужого" инструмента и "чужого" магика.
А цикл идет по всем OrdersTotal()

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
2 минуты назад, usver73 сказал:

ведь в справке не оговорено про пары?
Значит все ордера в рынке.
Ведь в функции подсчета "своих" ордеров советника практически всегда откидываем ордера "чужого" инструмента и "чужого" магика.
А цикл идет по всем OrdersTotal()

ну значит нужно сделать проще, не использовать эту функцию для подсчета по конкретной паре, заменяем ее на свой подсчет

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 минуту назад, diodio сказал:

ну значит нужно сделать проще, не использовать эту функцию для подсчета по конкретной паре, заменяем ее на свой подсчет

помнится в личке мы об этом говорили. И типовую функцию подсчета ордеров я тоже давал

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, Lexa000 сказал:

В данный момент Close All в тесте не работает

После нажатия на кнопку происходит ее удаление и рисование кнопок "CLOSE_YES" и "CLOSE_NO".
А потом происходит выход из функции.
image.png.497a9ff7a83f5d7a5863d64d5ba63fb8.png

Вынесите код закрытия ордеров в отдельную функцию, типа CloseAllOrders() и вставьте ее вызов перед return.
Читать код и искать ошибки будет легче

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
11 минут назад, usver73 сказал:

помнится в личке мы об этом говорили. И типовую функцию подсчета ордеров я тоже давал

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем доброго времени суток!!!

Подскажите пожалуйста в коде сеточного советника прописал отображение средней цены на графике. Всё бы ничего но не корректно удаляется линия после закрытия сетки то есть средой цены нет. пожалуйста подскажите что я сделал не так. Вот код и картинка. 

//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
{
    double avg_price, AveragePriceBuy, AveragePriceSell, order_lots = 0;
    price = 0;
   
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots() ;
         }
       }
    }
    avg_price = NormalizeDouble(price / order_lots, Digits);
    AveragePriceBuy = NormalizeDouble(avg_price + Spread, Digits);
    AveragePriceSell = NormalizeDouble(avg_price - Spread, Digits);
     {
     ObjectDelete(0, "AveragePriceLine");
     ObjectCreate("AveragePriceLine" ,OBJ_HLINE, 0, 0 ,AveragePriceBuy);
      ObjectCreate("AveragePriceLine" ,OBJ_HLINE, 0, 0 ,AveragePriceSell);
     ObjectSet("AveragePriceLine",OBJPROP_COLOR,Blue);
     }
    if ((otype == OP_BUY) && (Drawdown <= DrawdownClosingTakeprofitZero)) 
    tp = NormalizeDouble (AveragePriceBuy + TakeProfitGroupOrder*Point, Digits);
    if ((otype == OP_SELL) && (Drawdown <= DrawdownClosingTakeprofitZero))
    tp = NormalizeDouble (AveragePriceSell - TakeProfitGroupOrder*Point, Digits);
    if ((otype == OP_BUY) && (Drawdown > DrawdownClosingTakeprofitZero)) 
    tp = NormalizeDouble (AveragePriceBuy, Digits);
    if ((otype == OP_SELL) && (Drawdown > DrawdownClosingTakeprofitZero))
    tp = NormalizeDouble (AveragePriceSell, Digits);
    
    for(int i = OrdersTotal()-1; i>=0; i--) 
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
           if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
               if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                  Print("Ордера успешно модифицированы!");
                else Print("Ошибка модификации ордеров!");
           }
       }
    }
}   

image.thumb.png.75ade9cacd9b5398c3d3d9202d3d5b4c.png

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
54 минуты назад, Евгений72 сказал:

Подскажите пожалуйста в коде сеточного советника прописал отображение средней цены на графике.

У Вас наверняка есть функция подсчета ордеров в сетке.
В конце можно дописать

   if(countBUY+countSELL==0 && ObjectFind("AveragePriceLine")!=-1) ObjectDelete("AveragePriceLine");

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
21 час назад, usver73 сказал:

У Вас наверняка есть функция подсчета ордеров в сетке.
В конце можно дописать

   if(countBUY+countSELL==0 && ObjectFind("AveragePriceLine")!=-1) ObjectDelete("AveragePriceLine");

 

Спасибо за ответ но это не помогло

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
42 минуты назад, Евгений72 сказал:

Спасибо за ответ но это не помогло

почему не помогло? Разбирались?
п.с. описанный способ сам применял в сеточнике.
Валяется в ветке Spring, поищите, если не лень разбираться

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Еще заинтересовал такой вопрос. Из статьи https://tlap.com/zapazdyvayushhie-indikatory/:

 

ris108.jpg

На рисунке выше к StDev добавлена скользящая средняя с периодом 20; чтобы ее отобразить, перетащите Moving Average «в подвал» и выберите пункт расчета «Previous Indicator’s Data».

Как можно получить в MQL4 показания такого индикатора: StdDev(18) -> MA(20) ?

Изменено пользователем VitChel
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
53 минуты назад, VitChel сказал:

Как можно получить в MQL4 показания такого индикатора: StdDev(18) -> MA(20) ?

Вам нужно получить 20 последних значений индикатора StdDev, поместить их в массив и передать в функцию расчета МА.
У меня в тереме в папке Inqlude есть MovingAverages.mqh, в нем есть эти функции. Думаю, это из стандартной поставки
 

/+------------------------------------------------------------------+
//| Simple Moving Average                                            |
//+------------------------------------------------------------------+
double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
   if(position>=period-1 && period>0)
     {
      //--- calculate value
      for(int i=0;i<period;i++) result+=price[position-i];
      result/=period;
     }
//---
   return(result);
  }

 

  • Спасибо 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

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

например я объявляю символ

extern string       Symbol1          = "AUDCAD";

и в дальнейшем название этого символа должно попасть в функцию OrderSymbol()

Правильно ли будет такое представление написания торгового инструмента, или же лучше писать как

extern string       Symbol1          = "audcad";

т.е. я меняю регистр написания чтоб советник понял какую пару брать.

В справочнике ничего про регистр не сказано.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
26 минут назад, diodio сказал:

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

например я объявляю символ

extern string       Symbol1          = "AUDCAD";

и в дальнейшем название этого символа должно попасть в функцию OrderSymbol()

Правильно ли будет такое представление написания торгового инструмента, или же лучше писать как

extern string       Symbol1          = "audcad";

т.е. я меняю регистр написания чтоб советник понял какую пару брать.

В справочнике ничего про регистр не сказано.

Регистр имеет значение.

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

 

И пару функций в помощь:

 

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает строку в ВЕРХНЕМ регистре                           |
//+----------------------------------------------------------------------------+
string StringUpper(string s) {
  int c, i, k=StringLen(s), n;
  for (i=0; i<k; i++) {
    n=0;
    c=StringGetChar(s, i);
    if (c>96 && c<123) n=c-32;    // a-z -> A-Z
    if (c>223 && c<256) n=c-32;   // а-я -> А-Я
    if (c==184) n=168;            //  ё  ->  Ё
    if (n>0) s=StringSetChar(s, i, n);
  }
  return(s);
}

 

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает строку в нижнем регистре                            |
//+----------------------------------------------------------------------------+
string StringLower(string s) {
  int c, i, k=StringLen(s), n;
  for (i=0; i<k; i++) {
    n=0;
    c=StringGetChar(s, i);
    if (c>64 && c<91) n=c+32;     // A-Z -> a-z
    if (c>191 && c<224) n=c+32;   // А-Я -> а-я
    if (c==168) n=184;            //  Ё  ->  ё
    if (n>0) s=StringSetChar(s, i, n);
  }
  return(s);
}

 

Изменено пользователем Ent
  • Спасибо 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Доброго времени суток!!!

Подскажите пожалуйста 

Вот счетчик и идентификатор ордеров 

//+----------------------------------------------------------------------------+
//| Счетчик ордеров                                                            |
//+----------------------------------------------------------------------------+
int CountTrade()
{
    int count = 0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
              if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              count++;  
            }
         }
    }
    return(count);
}

Далее эта функция всплывает в начале советника 

 if (CountTrade() == 0)

И далее идут условия для открытия первого ордера.

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

"Если в терминале есть хоть один ордер, любого символа, любого типа. любого магика) то тогда ордер не открывать!

Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...