Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 623

 
neverness:

Я же уже описал простейшую задачу.

Открываем редактор MetaEditor.

Нажимаем кнопочку Файл->Создать.

В выпрыгивающем поле выбираем Индикатор.

...

Но подобный код транслятор MQL не воспринимает никак.

Примерно через 20 минут отвечу

 
neverness:

Что Вы как дети, в самом деле, воду баламутите?

Да никто ничего не баламутит. Вот наконец-то немного ситуация начала проясняться. Вы оказывается скриптом называете функцию которую в теле основного кода размещать нельзя.

Ещё не следует забывать, что МТ предназначен для работы с деньгами которые надо защищать от посягательств третьих лиц. Отсюда большинство ограничений языка.

neverness:

Я же уже описал простейшую задачу.

Открываем редактор MetaEditor.

Нажимаем кнопочку Файл->Создать.

В выпрыгивающем поле выбираем Индикатор.

И в поле индикатора OnCalculate() внедряем любой скриптовый объект с событием OnStart().

Лично я не знаю, как это сделать. Ну, например так:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
for(int i = 1; i < 100;i++)

      {

      if(open[i] > Max)

            {

            OnStart()

           И здесь пишем скрипт построения интересующего нас объекта. Например, эллипса, или буквы на графике, или еще чего-нибудь

            }  //if(open)

      }  //for(int i)  
//--- return value of prev_calculated for next call
   return(rates_total);
  } // OnCalculate

Как-то так, наверное, это должно выглядеть.

Но подобный код транслятор MQL не воспринимает никак.

Это должно выглядеть примерно так

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
for(int i = 1; i < 100;i++)
      {
      if(open[i] > Max)
            {
            
           if(int  ObjectFind(chart_id, /* идентификатор графика*/ object_name/* имя объекта*/) < 0)
            ObjectCreate(Здесь параметры функции согласно документации.
                         Например, эллипса, или буквы на графике, или еще чего-нибудь);
               
            }  //if(open)
      }  //for(int i)  
//--- return value of prev_calculated for next call
   return(rates_total);
  } // OnCalculate
 
Vitaly Muzichenko:

Примерно через 20 минут отвечу

Долго загружалось видео - более 40 минут. 


//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
 {
  EllipseCreate(0, "Ellipse", 0, 0, 0, 0, 0, 0, 0, clrRed, STYLE_SOLID, 1, true, true);
//--- indicator buffers mapping
   return(INIT_SUCCEEDED);

 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
 ArraySetAsSeries(time,true);
 ArraySetAsSeries(open,true);
 // ....
  ObjectMove(0, "Ellipse",0,time[1],open[5]);
  ObjectMove(0, "Ellipse",1,time[10],open[15]);
  ObjectMove(0, "Ellipse",2,time[20],open[25]);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

bool EllipseCreate(const long            chart_ID=0,        // ID графика 
                   const string          name="Ellipse",    // имя эллипса 
                   const int             sub_window=0,      // номер подокна  
                   datetime              time1=0,           // время первой точки 
                   double                price1=0,          // цена первой точки 
                   datetime              time2=0,           // время второй точки 
                   double                price2=0,          // цена второй точки 
                   datetime              time3=0,           // время третьей точки 
                   double                price3=0,          // цена третьей точки 
                   const color           clr=clrRed,        // цвет эллипса 
                   const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий эллипса 
                   const int             width=1,           // толщина линий эллипса 
                   const bool            fill=false,        // заливка эллипса цветом 
                   const bool            back=false,        // на заднем плане 
                   const bool            selection=true,    // выделить для перемещений 
                   const bool            hidden=true,       // скрыт в списке объектов 
                   const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- установим координаты точек привязки, если они не заданы 
  // ChangeEllipseEmptyPoints(time1,price1,time2,price2,time3,price3); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим эллипс по заданным координатам 
   if(!ObjectCreate(chart_ID,name,OBJ_ELLIPSE,sub_window,time1,price1,time2,price2,time3,price3)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать эллипс! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим цвет эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль линий эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим толщину линий эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); 
//--- включим (true) или отключим (false) режим заливки эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим выделения эллипса для перемещений 
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект 
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   return(true); 
  } 
Файлы:
Set.mq5  10 kb
 
Vitaly Muzichenko:

Долго загружалось видео - более 40 минут. 

Я тоже иногда путаю разделы форума и на вопрос по mql4 пишу ответ на mql5.

В принципе, в этом случае ничего не изменится кроме расширения файла, но в mql4 будет лишним

 ArraySetAsSeries(time,true);
 ArraySetAsSeries(open,true);

и даже абсолютно ненужным и бесполезным.

 
neverness:

Что Вы как дети, в самом деле, воду баламутите?

Просто зайдите в редактор MetaEditor, и наберите команду: Файл->Создать...

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

В частности это будут болванки:

- Советник

- Пользовательский индикатор

- Скрипт

- Библиотека и т.д.

Нас интересуют первые три пункта: Советник, Пользовательский индикатор и Скрипт.

Сравниваем эти болванки:

в советнике мы имеем события:

-OnInit(), OnDeinit(), OnTick(), OnTimer, OnChartEvent() … все, больше нет. 

в скрипте мы имеем события:

- OnStart() …  все, больше нет.

в индикаторе мы имеем события:

- OnInit(), OnCalculate(), OnTimer, OnChartEvent() … все, больше нет.

Здесь вполне естественным является вопрос о том, каким образом осуществлять связь между этими объектами.

Выясняется, что никакой связи  в MQL  между ними нет и быть не может, поскольку потоки данных между этими объектами полностью разделены, и никакой связи между ними нет.

Более того, меня удивляет тот факт, что создатели MQL выдают этот факт нам как "благо".

И если, например, в рамках С++ я могу спокойно вызвать транслятор Бэйсика, или JavaSсript, или любой другой, и перейти, например, в среду программирования Android,

то в рамках MQL у меня нет возможности даже создать так называемый "скрипт" в среде "индикатора", поскольку среда индикатора не воспринимает команду OnStart().

Это что за уродство ???

И таких уродств в MQL более чем достаточно.

Они на каждом шагу.

Я читаю описание MQL - и удивляюсь, поскольку больше ничего не остается делать. 

И при этом создатели MQL громогласно заявляют, что MQL является наследником С++.

Я извиняюсь, конечно, но хотелось бы спросить у создателей MQL:  - Наследником в чем? - В уродствах?


Я невольно сравниваю MQL с  известной средой программирования 1С. Они тоже утверждают, что являются наследниками С++

 Но там все сделано гораздо более прилично.

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

А в MQL что?

Ни встроенных классов, ни объектов, связанных с потоком,  … и вообще ничего. 

И это я еще ничего не сказал о математической оболочке терминала!!!

Это вообще отдельная тема для удивлений!!!

Давайте вы немного всё-таки почитаете справку, найдёте в ней всё то, чего вы говорите, что нету, почитаете о встроенных классах в СБ, подучитесь вежливо просить помощи (вы же за помощью обратились), научитесь не хамить людям, пытающимся вам помочь (заметьте - бескорыстно)...

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

Без обид - кто к нам с ничем придёт, тот от не пойми чего и погибнет

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

 

как установить МТ4 на МакОС? помогите плиз!

 

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

https://www.parallels.com/ru/products/desktop/

Запуск Windows на Mac — виртуальная машина Parallels Desktop 14 для Mac
  • www.parallels.com
Можно запустить Windows параллельно с macOS® (перезагрузка не требуется) на компьютерах MacBook®, MacBook Pro®, iMac®, iMac Pro®, Mac mini® или Mac Pro®. Предоставляйте общий доступ к файлам и папкам, копируйте и вставляйте текст и изображения, перетаскивайте файлы между приложениями Mac и Windows. Удобная настройка Parallels Desktop...
 

Прошу помощи. Вопросы такие:

1. Программа не выставляет стоп лоссы ни на бай, ни на селл в режиме теста. Но модификация ордеров по отложенным проходит.

2. Не запускается на счёте в реальном времени.

Помогите пожалуйста.

И прошу указать на все ошибки, допущенные при написании программы.

За ранее спасибо.

Код программы:

.input int      Percent=50;

input int      MAGICNUMBER=413;

//Параметры констант индикаторов и осциляторов для долгосрочных графиков

input int      Signal_Period_long_term=6;

input int      Fast_EMA_Period_long_term=12;

input int      Slow_EMA_Period_long_term=24;

//Параметры констант индикаторов и осциляторов для краткосрочных графиков

input int      Stochastic_Kperiod_short_term=5;

input int      Stochastic_Dperiod_short_term=3;

input int      Stochastic_slowing_short_term=3;

input ENUM_TIMEFRAMES PERIODs_short_term=PERIOD_M5;

input ENUM_TIMEFRAMES PERIODs_long_term=PERIOD_H1;

//-----------------------------------------------------------------------------------------

//Общие переменные и их типы

static datetime New_Time;// Время текущего бара

static datetime Time_Local;

double Margin_Percent;  //Используемые средства для открытия ордеров

double Lots;//Определение общего количества лотов

double Lots_Volume;

//Переменные и типы для долгосрочного графика

double MacdCurrent_long_term;//Параметры MACD основной линии текущего бара

double MacdPrevious_long_term;//Параметры MACD основной линии предыдущего бара

double SignalCurrent_long_term;

//Переменные и типы для краткосрочного графика

double Stochastic_Current_short_term_main;//Параметры Stochastic текущего бара на 5-тиминутном графике

double Stochastic_Previous_short_term_main;//Параметры Stochastic предыдущего бара на 5-тиминутном графике

double Stochastic_Current_short_term_signal;//Параметры Stochastic текущего бара на 5-тиминутном графике

double Stochastic_Previous_short_term_signal;//Параметры Stochastic предыдущего бара на 5-тиминутном графике

double StopLoss_BUY;

double StopLoss_SELL;

double Price_BUY;

double Price_SELL;

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

//---


//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//---


  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

   int ticket,cnt;

   int total=OrdersTotal();// Опредление количства ордеров

   bool New_Bar=false;                    // Флаг нового бара


                                          //Определение значений переменных для долгосрочного графика

   MacdCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,1);

   MacdPrevious_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,2);

   SignalCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_SIGNAL,1);

//Определение значений переменных для краткосрочного графика

   Stochastic_Current_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,1);

   Stochastic_Previous_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,2);

   Stochastic_Current_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,1);

   Stochastic_Previous_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,2);

//Определение общих переменных   

   Price_BUY=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

   Price_SELL=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

   StopLoss_BUY=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

   StopLoss_SELL=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

   Margin_Percent=AccountFreeMargin()*Percent/100;

   Lots=NormalizeDouble(Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);

   Lots_Volume=NormalizeDouble(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP),2);

//-----------------------------------------------------------------------------------------------------------------------

//----- Определение нового бара------------------------------------------------------------------------------------------

   New_Time=TimeCurrent();

   Print("Время =",TimeCurrent());

   Print("Время открытия бара =",iTime(NULL,PERIODs_short_term,0));

   if(iTime(NULL,PERIODs_short_term,0)==New_Time) // Сравниваем время

     {

      if(iVolume(NULL,PERIODs_short_term,0)<=2) //Сравниваем объём

         Print("Объём бара =",Volume[0]);

      if(iBarShift(NULL,PERIODs_short_term,TimeCurrent())==0)//Проверка индекса бара

         Print("Номер бара =",iBarShift(NULL,PERIODs_short_term,TimeCurrent()));

      New_Bar=true;      // Поймался новый бар

      Print("Новый бар");

     }

   else if(New_Bar==false) // Если бар не новый..

     {

      Print("Бар не новый");

      return;

     }

//---Проверка на наличие денежных средств для открытия минимального лота 

   if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT)))

     {

      Print("Не хватает средств. Свободные средства = ",AccountFreeMargin());

      return;

     }

//---Определение количества лотов

   if(Lots>Lots_Volume)

     {

      Lots=NormalizeDouble(Lots_Volume,2);

      Print("Количество лотов : ",Lots);

     }

   else if(Lots<Lots_Volume)

     {

      Lots=NormalizeDouble(MathFloor(Lots),2);

      Print("Количество лотов : ",Lots);

     }

//+------------------------------------------------------------------+

//|    Условия открытия одеров при количестве ордеров равных нулю    |

//+------------------------------------------------------------------+

   if(total<1)

     {


      if(MacdCurrent_long_term<0 && MacdCurrent_long_term>SignalCurrent_long_term)

         Print("Условие верно для BUY");

        {

         //+---------------------------------------------------------------------------+

         //|     Условие для открытия только длинных позиций BUY                       |

         //+---------------------------------------------------------------------------+

         if(Stochastic_Current_short_term_main<Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main>=Stochastic_Previous_short_term_signal)

           {

            ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price_BUY,3,0,0,NULL,MAGICNUMBER,0,Blue);

            if(ticket>0)//проверка отрытия позиции

              {

               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

                 {

                  Print("BUY ордер открыт : ",OrderOpenPrice());

                  return;

                 }

               else Print("Ошибка открытия ордера BUY : ",GetLastError());

               return;

              }

           }

        }

      if(MacdCurrent_long_term>0 && MacdCurrent_long_term<SignalCurrent_long_term)

         Print("Условие верно для SELL");

        {

         //+---------------------------------------------------------------------------+

         //|     Условие для открытия только коротких позиций SELL                     |

         //+---------------------------------------------------------------------------+

         if(Stochastic_Current_short_term_main>Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main<=Stochastic_Previous_short_term_signal)

           {

            ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Price_SELL,3,0,0,NULL,MAGICNUMBER,0,Green);

            if(ticket>0)//проверка отрытия позиции

              {

               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

                 {

                  Print("SELL ордер открыт : ",OrderOpenPrice());

                  return;

                 }

               else Print("Ошибка открытия ордера SELL : ",GetLastError());

               return;

              }

           }

        }

     }


//+---------------------------------------------------------------------------+

//|                     Условия модификации ордеров                           |

//+---------------------------------------------------------------------------+


   for(cnt=0;cnt<total;cnt++)

      //+------------------------------------------------------------------+

      //|                                                                  |

      //+------------------------------------------------------------------+

     {

      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))

         continue;

      if(OrderMagicNumber()==MAGICNUMBER && // проверка магического номера ордера 

         OrderSymbol()==Symbol()) // проверка символа ордера

        {

         //--- длинная позиция открыта

         if(OrderType()==OP_BUYSTOP)

           {

            if(OrderOpenPrice()<Price_BUY && Ask<Price_BUY)

              {

               if(OrderModify(OrderTicket(),Price_BUY,0,0,0,Blue))

                  Print("Цена Price_BUY ордера успешно модифицирована.");

               else Print("Ошибка модификации ордера BUYStop. Код ошибки=",GetLastError());

               return;

              }

            else Print("Цена модификации выше цены ордера");

            return;

           }

         if(OrderType()==OP_SELLSTOP)

           {

            if(OrderOpenPrice()<Price_SELL && Bid>Price_SELL)

              {

               if(OrderModify(OrderTicket(),Price_SELL,0,0,0,Green))

                  Print("Цена Price_SELL ордера успешно модифицирована.");

               else Print("Ошибка модификации ордера SELLStop. Код ошибки=",GetLastError());

               return;

              }

           }

         if(OrderType()==OP_BUY)

           {

            if(OrderStopLoss()<StopLoss_BUY && StopLoss_BUY<Ask)

              {

               if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_BUY,0,0,Blue))

                  Print("Цена Price_BUY ордера успешно модифицирована.");

               else Print("Ошибка модификации ордера BUY. Код ошибки=",GetLastError());

               return;

              }

           }

         if(OrderType()==OP_SELL)

           {

            if(OrderStopLoss()>StopLoss_SELL && StopLoss_SELL>Bid)

              {

               if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))

                  Print("Цена Price_SELL ордера успешно модифицирована.");

               else Print("Ошибка модификации ордера SELL. Код ошибки=",GetLastError());

               return;

              }

           }

        }

     }


  }

//+------------------------------------------------------------------+

 

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

https://prnt.sc/kut6xo

https://prnt.sc/kut79b

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
Файлы:
 
Michail_David:

Прошу помощи. Вопросы такие:

1. Программа не выставляет стоп лоссы ни на бай, ни на селл в режиме теста. Но модификация ордеров по отложенным проходит.

2. Не запускается на счёте в реальном времени.


 Вот так 

 if(OrderType()==OP_SELL)

           {

            if(OrderStopLoss()!=StopLoss_SELL && StopLoss_SELL>Bid)

будет модифицировать И код, вставляйте корректно (Alt+S).