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

 
Maxim Kuznetsov #:
При открытии файла сбросить флаги SHARE_READ SHARE_WRITE, чтение/запись только инклюзивые. Но это не точно :-)


Решение:

Если кто-то столкнется с похожей задачей,  решение с обменом данными через файлы следующее:   

Запись делается во временный файл. Потом он переименовываете в финальное имя. Вторая программа всегда получает дописанный файл. 

Соответственное, если нужен обмен в обе стороны, то лучше два файла. 

 

Добрый день!

Можно ли в разрабатываемом советнике подключить Трейлинг стоп стандартный из Metatrader5 ?

Заранее благодарю.

С уважением, Александр

 
klycko #:

Добрый день!

Можно ли в разрабатываемом советнике подключить Трейлинг стоп стандартный из Metatrader5 ?

Заранее благодарю.

С уважением, Александр

нельзя. "Стандартным" тралом терминала управлять из советника нельзя

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

 
Maxim Kuznetsov #:

нельзя. "Стандартным" тралом терминала управлять из советника нельзя

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

Спасибо! Я так и думал. Очень жаль.

Может посоветуете исходный код такого тральщика для включения в советник?

Счет с хеджированием.

 
Возможно ли установить второй экземпляр MT5 (не portable), скачанный с этого сайта?
 

Как максимально проще сделать выбор таймфреймов с INPUT, без перечислений, с выбором нужного "true/false" ?

ENUM_TIMEFRAMES Periods[] = {/*PERIOD_M1,*/PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1/*, PERIOD_H4*/};
int CountTF=ArraySize(Periods);
 
Vitaly Muzichenko #:

Как максимально проще сделать выбор таймфреймов с INPUT ?

Сделайте пользовательский enum 

 
Alexey Viktorov #:

Сделайте пользовательский enum 

Пересмотрел подход!

Как заполнить массив Periods[] с выбранных TF в INPUT

ENUM_TIMEFRAMES Periods[] = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1, PERIOD_H4};
int CountTF=ArraySize(Periods);

Если выбрано PERIOD_CURRENT = пропускаем этот таймфрейм, и заполняем массив только с выбранными периодами

input ENUM_TIMEFRAMES TF1 = PERIOD_M1;
input ENUM_TIMEFRAMES TF2 = PERIOD_CURRENT;
input ENUM_TIMEFRAMES TF3 = PERIOD_M15;
input ENUM_TIMEFRAMES TF4 = PERIOD_M30;
input ENUM_TIMEFRAMES TF5 = PERIOD_H1;
input ENUM_TIMEFRAMES TF6 = PERIOD_CURRENT;
input ENUM_TIMEFRAMES TF7 = PERIOD_D1;
input ENUM_TIMEFRAMES TF8 = PERIOD_W1;
 
Vitaly Muzichenko #:

Пересмотрел подход!

Как заполнить массив Periods[] с выбранных TF в INPUT

Если выбрано PERIOD_CURRENT = пропускаем этот таймфрейм, и заполняем массив только с выбранными периодами

Сделал так, но что-то подсказывает, что можно проще

  string TF=(string)TF1+","+(string)TF2+","+(string)TF3+","+(string)TF4+","+(string)TF5+","+(string)TF6+","+(string)TF7+","+(string)TF8;
  string res[];
  StringSplit(TF,',',res);
  Print(res[3]);
 

Приветствую! Не могу ответить на вопрос,- почему не удаляются или удаляются объекты при OnDeinit.

//+------------------------------------------------------------------+
//|                                                     Clean(2).mq4 |
//|                                  Copyright 2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#define  inp
long arrChar[]={0};
long _IdC=0; 
//--------------------------------------------------------------------
input string           InpName="Editi";              // Имя объекта 
input string           InpText="Text";              // Текст объекта 
input string           InpFont="Arial";             // Шрифт 
input int              InpFontSize=14;              // Размер шрифта 
inp ENUM_ALIGN_MODE  InpAlign=ALIGN_CENTER;       // Способ выравнивания текста 
inp bool             InpReadOnly=false;           // Возможность редактировать 
inp ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Угол графика для привязки 
input color            InpColor=clrBlack;           // Цвет текста 
input color            InpBackColor=clrWhite;       // Цвет фона 
inp color            InpBorderColor=clrBlack;     // Цвет границы 
inp bool             InpBack=false;               // Объект на заднем плане 
input bool           InpSelection=true;          // Выделить для перемещений 
inp bool             InpHidden=false;              // Скрыт в списке объектов 
inp long             InpZOrder=2;                 // Приоритет на нажатие мышью 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  _IdC=ChartID();
 EventSetMillisecondTimer(4025);
//---
   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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//-------------------------------------------------------------------
void OnTimer()
{
 int err=0;
 long top=0;
 string sym="";
 top=  func();
 if(top!=_IdC)
 {
 err=GetLastError();
 sym=ChartSymbol(top);
  if(sym>"")
     {
     CreateObj(top);
     ChartSetInteger(top,CHART_FOREGROUND,0,false); // график снизу
     ChartRedraw(top); 
      }
    }  
 Print("top = ",top," sym = ",sym," Err = ",err);
 ChartList();
} 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   DeleteObjects();
   EventKillTimer();
  } 
//+------------------------------------------------------------------+
//  Вернем идентификатор активного графика
//----------------------------------------------------------------------- 
long func() 
  { 
  long currChart,prevChart=ChartFirst();
   long sum=0;
   int i=0,limit=100;
   while(i<limit) 
     { 
     if(i==0)
      currChart=prevChart;
      else
      currChart=ChartNext(prevChart); // на основании предыдущего получим новый график
     if(currChart<0) break;          // достигли конца списка графиков
       prevChart=currChart;// запомним идентификатор текущего графика для ChartNext()
     if(ChartTop(currChart))
      sum=currChart;
      ArrayResize(arrChar,i+1);
      arrChar[i]= currChart;  //Запишем в массив arrChar иденти-ры
      Print("currChart = ",currChart," i = ",i," ChartSymbol()) = ",ChartSymbol(currChart)," Period  = ",ChartPeriod(currChart)," sum = ",sum);
      i++;
     } 
   return(sum); 
  }
//---------------------------------------------------
// Если true, то график на первом плане
//--------------------------------------------------------
  bool ChartTop(long chart_ID)
  {
  long win=0;
     //--- сбросим значение ошибки 
   ResetLastError();
   //--- проверим, находится ли график поверх всех других 
   if(!ChartGetInteger(chart_ID,CHART_BRING_TO_TOP,0,win)) 
     { 
      //--- выведем сообщение об ошибке в журнал "Эксперты" 
      Print(__FUNCTION__+", Error Code = ",GetLastError()); 
      return(false); 
     } 
     if(win>0)
     return(true);
    //--- успешное выполнение 
   return(false);
  }  
//-------------------------------------------------------------------------------
void ChartList()
{
 int size=ArraySize(arrChar);
 for(int i=0;i<=size-1;i++)
 {
   string str= ChartSymbol(arrChar[i]);
   Print("chartes = ",arrChar[i]," str = ",str," i = ",i);
 }
}
//------------------------------------------------------------------------
void DeleteObjects()
  {
   long de=0;
   int size=ArraySize(arrChar),f=0;
   Print("size = ",size);
   do
   {
   de=arrChar[f];
   int objects=ObjectsTotal(de,-1);
   for(int i=0;objects-1>=i; i++)
     {
      string name=ObjectName(i);
      Print("i = ",i," name = ",name," de = ",de);
      if(StringFind(name,"Editi")!=-1)
         if(!ObjectDelete(de,name))
         { 
      //--- выведем сообщение об ошибке в журнал "Эксперты" 
      Print(__FUNCTION__+", Error Code = ",GetLastError()); 
         }
        else 
         Print("i = ",i," Объект с именем ",name," на ChartSymbol = ",ChartSymbol(de)," с иден-ром ",de," Удален!");
      }
     Print("   f = ",f," de = ",de);
     f++;
     }
     while(f<=size-1);
   }
//+------------------------------------------------------------------+ 
//| Создает объект "Поле ввода"                                      | 
//+------------------------------------------------------------------+ 
bool EditCreate(const long             chart_ID=0,               // ID графика 
                const string           name="Edit",              // имя объекта 
                const int              sub_window=0,             // номер подокна 
                const int              x=0,                      // координата по оси X 
                const int              y=0,                      // координата по оси Y 
                const int              width=50,                 // ширина 
                const int              height=18,                // высота 
                const string           text="Text",              // текст 
                const string           font="Arial",             // шрифт 
                const int              font_size=10,             // размер шрифта 
                const ENUM_ALIGN_MODE  align=ALIGN_CENTER,       // способ выравнивания 
                const bool             read_only=false,          // возможность редактировать 
                const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки 
                const color            clr=clrBlack,             // цвет текста 
                const color            back_clr=clrWhite,        // цвет фона 
                const color            border_clr=clrNONE,       // цвет границы 
                const bool             back=false,               // на заднем плане 
                const bool             selection=true,          // выделить для перемещений 
                const bool             hidden=true,              // скрыт в списке объектов 
                const long             z_order=0)                // приоритет на нажатие мышью 
  { 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим поле ввода 
   if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать объект \"Поле ввода\"! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим координаты объекта 
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); 
//--- установим размеры объекта 
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); 
//--- установим текст 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 
//--- установим шрифт текста 
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 
//--- установим размер шрифта 
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); 
//--- установим способ выравнивания текста в объекте 
   ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,align); 
//--- установим (true) или отменим (false) режим только для чтения 
   ObjectSetInteger(chart_ID,name,OBJPROP_READONLY,read_only); 
//--- установим угол графика, относительно которого будут определяться координаты объекта 
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 
//--- установим цвет текста 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим цвет фона 
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 
//--- установим цвет границы 
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим перемещения метки мышью 
   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); 
  } 
//--------------------------------------------------------------------
bool CreateObj(long _ID)
{
   if(ObjectFind(_ID,InpName)!=0)
   {
   EditCreate(_ID,InpName,0,700,400,420,90,InpText,InpFont,InpFontSize,InpAlign,InpReadOnly,
   InpCorner,InpColor,InpBackColor,InpBorderColor,InpBack,InpSelection,InpHidden,InpZOrder);
   EditCreate(_ID,InpName+" смотреть",0,700,491,209,70,"see",InpFont,InpFontSize,InpAlign,InpReadOnly,
   InpCorner,InpColor,InpBackColor,InpBorderColor,InpBack,false,InpHidden,InpZOrder);
   EditCreate(_ID,InpName+" игнорировать",0,910,491,210,70,"overlook",InpFont,InpFontSize,InpAlign,InpReadOnly,
   InpCorner,InpColor,InpBackColor,InpBorderColor,InpBack,InpSelection,InpHidden,InpZOrder);
        return true;
        }
    return false;
}