Ваши вопросы по языку MQL4

ИванМН

Местный знаток
В OnInit() создавать глобальную переменную при оптимизации:
C-подобный:
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
 {
  if(IsOptimization())
   {
     if(!GlobalVariableCheck("Start"))
      GlobalVariableSet("Start",1);
   }
 }
А по окончанию прогона удалить её:
C-подобный:
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(IsOptimization())
   {
     GlobalVariableDel("Start");
   }
}
если прогон окажется не последним - глобальная будет создана снова.
Спасибо за ответ, но Вы не поняли: мне нужно, чтобы глобалка была создана один раз перед началом ПЕРВОГО (а не каждого) прогона оптимизации и удалена также единожды после окончания ПОСЛЕДНЕГО (а не каждого) прогона. Такое возможно?
Могу пояснить, для чего это нужно: перед началом первого прогона оптимизации советник должен очистить папку от файлов, которые будут туда писаться во время этого и последующих прогонов. Начиная со второго прогона, удалять содержимое папки нельзя. Поэтому и нужен передаваемый от прогона к прогону сигнал о том, что папка уже очищена, в виде глобальной переменной.
Может быть, можно как-либо иначе решить эту задачу?
 

mobidik

-----
Так и Вы не писали как будет использоваться и для чего, а я не экстрасенс...
Могу пояснить, для чего это нужно: перед началом первого прогона оптимизации советник должен очистить папку от файлов, которые будут туда писаться во время этого и последующих прогонов. Начиная со второго прогона, удалять содержимое папки нельзя.
Если в OnInit() есть глобальная с именем "Start" - значит это не первый запуск бота, т.е., следующий прогон. Соответственно, если её нет - то это самый первый запуск бота на оптимизацию - удаляете содержимое нужной папки. Самое главное, что они, глобальные переменные, создаются, а как их использовать между собой - Вам решать. Тут, правда, встает новый вопрос: а кто будет удалять глобалку по завершению самой оптимизации? Как вариант, создавать две глобалки с разными именами: одну в OnInit(), а другую в OnDeinit() - записывать время. Смысл в том, что по завершению очередного прогона, глобалка по времени созданная в OnDeinit() будет практически с таким же значением по времени, как и глобалка созданная в OnInit() нового прогона - отсюда вывод: если существуют две глобалки и записанное в них время, вернее их разница по времени менее 1 сек - идет очередной прогон - ничего не удаляем, а если время больше - тогда это новый запуск бота на оптимизацию. Как то так.
 

1_Lexa

Активный участник
Нужно с умом подходить к любым изменениям в коде. Просто вставить кусок кода и ждать маны небесной - смешно!
Код:
int   Slippage=3;
int   Retries=10;
bool  AutoTrade=true;
bool  ecnBroker=false;
//bool errororder = true;
input    int MagicID=12345786;
input    double LOTS=0.01;
input    int risk=0;//risk: 0-->fixed lots
input    double SL=500;
input    double TP=50;
extern   bool Trailing = true;
extern double TrailingStop =10.0;
extern double TrailingStep =10.0;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
union Price
  {
   uchar    buffer[8];
   double   close;
  };

double   data[][2];

int      BytesToRead;
string   datapath;
string   result;
Price    m_price;

double   g_Point;
int      ticket=0;

string   account_server;
double    Buy, lotbuy, lotsbuy, Sell, lotsell, lotssell, SUM, SWAP,
          profitbuy, profitsell, OP, dg,
          sumbuy, sumsell, bepbuy, bepsell, lowlotbuy, lowlotsell, hisell,
          lobuy;
//datetime expDate=D'2029.10.12 02:00';//yyyy.mm.dd
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!IsDllsAllowed())
     {
      Alert("Make Sure DLL Import is Allowed");
      ExpertRemove();
      return(INIT_FAILED);
     }
  
//------------------------------------------------------
//---
{
    g_Point=Point;
      if(Digits==5 || Digits==3)
        {
         g_Point *= 10;
         Slippage*=10;
          TrailingStop *=10;
           TrailingStep *=10;
        }
         else
      if(Digits==4)
        {
         g_Point *= 100;
         Slippage*=100;
        }
      ChartSetInteger(0,17,0,0);
      ChartSetInteger(0,0,1);
       account_server=AccountInfoString(3);
      if(account_server=="")
        {
         account_server="default";
        }
      /*datapath=TerminalInfoString(3)+"\\history\\"
               +account_server+"\\"+Symbol()+"240"+".hst";
      ReadFileHst(datapath);*/
      //---
      return(INIT_SUCCEEDED);
     }
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll();
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

     if(Minute() == 0)
     {
      datapath=TerminalInfoString(3)+"\\history\\"
               +account_server+"\\"+Symbol()+"240"+".hst";
      ReadFileHst(datapath);
     }
//----------------------------Tampilan EA-----------------------------------------------//

   ObjectCreate(0,"MENU",OBJ_RECTANGLE_LABEL,0,0,0);
   ObjectSetInteger(0,"MENU",OBJPROP_XSIZE,275);
   ObjectSetInteger(0,"MENU",OBJPROP_YSIZE,325);
   ObjectSetInteger(0,"MENU",OBJPROP_COLOR,Silver);
   ObjectSetInteger(0,"MENU",OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,"MENU",OBJPROP_YDISTANCE,10);
   ObjectSetInteger(0,"MENU",OBJPROP_BGCOLOR,C'40,40,40');
   ObjectSetInteger(0,"MENU",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"MENU",OBJPROP_WIDTH, 1);
   ObjectSetInteger(0,"MENU",OBJPROP_STYLE, STYLE_SOLID);
   ObjectSetInteger(0,"MENU",OBJPROP_BACK, False);

// Close All
   ObjectCreate(0,"CL",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"CL",OBJPROP_XSIZE,225);
   ObjectSetInteger(0,"CL",OBJPROP_YSIZE,25);
   ObjectSetInteger(0,"CL",OBJPROP_BORDER_COLOR,Silver);
   ObjectSetInteger(0,"CL",OBJPROP_XDISTANCE,123);
   ObjectSetInteger(0,"CL",OBJPROP_YDISTANCE,300);
   ObjectSetString(0,"CL",OBJPROP_TEXT,"Close ALL");
   ObjectSetInteger(0,"CL",OBJPROP_BGCOLOR,Blue);
   ObjectSetString(0,"CL",OBJPROP_FONT,"Arial Black");
   ObjectSetInteger(0,"CL",OBJPROP_FONTSIZE,9);
   ObjectSetInteger(0,"CL",OBJPROP_COLOR,White);



   Display_Info();






   double SetPoint=g_Point;

   static datetime previousBar;
   if(previousBar!=Time[0])
     {
      previousBar=Time[0];
      ChartRedraw();
     }
   else
     {
      return;
     }

   if(iVolume(Symbol(),PERIOD_H4,0)>iVolume(Symbol(),PERIOD_H4,1))
      return;
//**********************************


   if(!BytesToRead>0)
      return;

   int pos = -1 ;
   for(int i = 0 ; i < BytesToRead - 1 ; i++)
     {
      if(!(data[i][0]<Time[0]))
         break;
      pos = i + 1;
     }

//********************************
   HideTestIndicators(True);
   double wpr= iWPR(Symbol(),0,4,0);
   double ao = iAO(Symbol(),0,0);
   HideTestIndicators(false);

   double level=NormalizeDouble(data[pos][1],Digits);
   ObjectDelete("level");
   MakeLine(level);

   if(data[pos][1]>Open[0])
      Comment("BUY - ", data[pos][1]);
   if(data[pos][1]<Open[0])
      Comment("SELL - ", data[pos][1]);

   if(MarketInfo(Symbol(),MODE_SPREAD)>40)
      return;

   if(pos>0)
     {
      if(CheckMarketBuyOrders()<70 && CheckMarketSellOrders()<70)
        {
         if(data[pos][1]>Open[0])
            if(IsBuyPinbar())
              {
               //if(wpr<-80)
               //if(ao<0)
               double BuySL=NormalizeDouble(Ask - SL*g_Point,Digits);
               double BuyTP=NormalizeDouble(Ask + TP*g_Point,Digits);
               if(AccountFreeMarginCheck(Symbol(),OP_BUY,GetLots())>0)
                 {
                  ticket=OrderSend(Symbol(),OP_BUY,GetLots(),Ask,Slippage,BuySL,BuyTP,"",MagicID,0,clrGreen);
                   {
                     ModifyTP(0,rata_price(0)+TP*g_Point);
                    }
                  CloseSell();
                 }
              }

         if(data[pos][1]<Open[0])
            if(IsSellPinbar())
              {
               //if(wpr>-20)
               //if(ao>0)
               double SellSL=NormalizeDouble(Bid + SL*g_Point,Digits);
               double SellTP=NormalizeDouble(Bid - TP*g_Point,Digits);
               if(AccountFreeMarginCheck(Symbol(),OP_SELL,GetLots())>0)
                 {
                  ticket=OrderSend(Symbol(),OP_SELL,GetLots(),Bid,Slippage,SellSL,SellTP,"",MagicID,0,clrGreen);
                 {
                     ModifyTP(1,rata_price(1)-TP*g_Point);
                    }
                  CloseBuy();
                 }
              }
              Trailing();
        }
     }
   return;
  }
  //==============================
  void Trailing()
  {
   for(int i=OrdersTotal() -1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicID)
           {
            if(OrderType() == OP_BUY)
              {
               if(Bid - OrderOpenPrice() > TrailingStop * Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() < Bid-(TrailingStop + TrailingStep) * Point || OrderStopLoss() == 0)
                    {
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop * Point, Digits),0,0))
                        Print("Ошибка модификации ордера на покупку");
                    }
                 }
              }
            if(OrderType() == OP_SELL)
              {
               if(OrderOpenPrice() - Ask > TrailingStop * Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() > Ask + (TrailingStep + TrailingStop) * Point || OrderStopLoss() == 0)
                    {
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStop * Point, Digits),0,0))
                     Print("Ошибка модификации ордера на продажу");
                       
                    }
                 }
              }
           }
        }
     }
 
     }
Примерно так пытался пристроить ваш код, и еще другие. Мне нужен Trailing в профит. Ошибки не выходили, просто не работал Trailing
 

1_Lexa

Активный участник
Это основной код, от которого зависит работа всего советника
 

ZNV

Активный участник
Здравствуйте.
Подскажите пожалуйста как реализовать... Код должен строить Фибоначи (от верха до низа рабочей зоны 0-100), но как сделать что бы это всегда была привязка к правой стороне, как на картинке?
 

Вложения

  • USDCHFH1.png
    USDCHFH1.png
    63,6 КБ · Просмотры: 41

griz

Активный участник
Здравствуйте. Под свечой находится объект Текст, который сдвинут левее от центра свечи. Как сдвинуть объект Текст вправо, чтобы он был хотя бы по центру свечи?
 

Вложения

  • GBPUSDM15-2.png
    GBPUSDM15-2.png
    17,6 КБ · Просмотры: 22

mobidik

-----
Здравствуйте.
Подскажите пожалуйста как реализовать... Код должен строить Фибоначи (от верха до низа рабочей зоны 0-100), но как сделать что бы это всегда была привязка к правой стороне, как на картинке?
Для построения фибо нужно две точки. Сам расчет фибки делаете согласно полученным(заданным) значениям: цена-1 / время- и цена-2 / время-2. Затем, одной из них, уже при построении, задаете время текущего бара, а для другой точки указываете время в будущем, скажем, время текущего бара + время 10 баров. В таком случае, фибка будет от текущего бара и вправо до границы окна.
 

mobidik

-----
Здравствуйте. Под свечой находится объект Текст, который сдвинут левее от центра свечи. Как сдвинуть объект Текст вправо, чтобы он был хотя бы по центру свечи?
Воспользуйтесь свойством объекта - привязка: OBJPROP_ANCHOR.

PS.
В справке, как раз, есть пример: OBJ_TEXT - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
 
Последнее редактирование модератором:
  • Like
Реакции: griz

ZNV

Активный участник
Для построения фибо нужно две точки. Сам расчет фибки делаете согласно полученным(заданным) значениям: цена-1 / время- и цена-2 / время-2. Затем, одной из них, уже при построении, задаете время текущего бара, а для другой точки указываете время в будущем, скажем, время текущего бара + время 10 баров. В таком случае, фибка будет от текущего бара и вправо до границы окна.
Спасибо! :D
 

Alex190

Интересующийся
Привет всем! Подскажите пожалуйста по правам советника! Вот если я куплю готового советника у программиста, затем добавлю в него то что посчитаю нужным, возможно даже и название поменяю. И как потом с этим советником... можно считать что это мой советник? а если я его не купил а мне его подарили? а если скачал где то в просторах интернета и потом его немного изменил .Я после этого собственник? Имеет ли какие то права на него после добавления функций бывший правообладатель и создатель? Подскажите кто в курсе
 

ZNV

Активный участник
Привет всем! Подскажите пожалуйста по правам советника! Вот если я куплю готового советника у программиста, затем добавлю в него то что посчитаю нужным, возможно даже и название поменяю. И как потом с этим советником... можно считать что это мой советник? а если я его не купил а мне его подарили? а если скачал где то в просторах интернета и потом его немного изменил .Я после этого собственник? Имеет ли какие то права на него после добавления функций бывший правообладатель и создатель? Подскажите кто в курсе
99% что вам дадут компилированый файл а не исходники. Ничего поменять вы не сможете. Программист может перестраховаться и завязать все на удаленный доступ к dll функциям. Короче, ничего у вас не получиться) Сможете только пользоваться советником по назначению и все.
 

mobidik

-----
Привет всем! Подскажите пожалуйста по правам советника! Вот если я куплю готового советника у программиста, затем добавлю в него то что посчитаю нужным, возможно даже и название поменяю. И как потом с этим советником... можно считать что это мой советник? а если я его не купил а мне его подарили? а если скачал где то в просторах интернета и потом его немного изменил .Я после этого собственник?
Если Вы купили именно у автора в открытом коде, прогер может и не быть автором, тогда имеете полное право делать с ним все, что угодно, если иное не было оговорено при продаже. Т.е., вместе с открытым кодом вы получаете и права на него. Если Вы скачали в открытом коде, не декомпил и что-то там добавили, то, по совести, указываете, что Вы автор той или иной доработки, а не автор "произведения". А так, по сети гуляет множество просто переименованных файлов, которые выдают за свое творение. В лучшем случае - изменят обвертку, добавят красок и поставят не слабый ценник :). Так, что, на счет того, что скачали и доработали - считать себя собственником подобных творений или нет - решать Вам. Впрочем, многое зависит от самого содержания доработки и его объема, имхо.
 

AlexeyVik

Программист mql4 mql5
mobidik, а если взять чужой код, сказать всё что только можно сказать в адрес того говнокодера, но всё-же использовав формулы индикатора, например, или часть стратегии советника и написать полностью по-своему… Кому будут принадлежать права? О каких доработках можно указывать? Так и написать, типа «Сделано из дерьма, но вкусно…»? И вообще о каких правах может идти речь?
А если заказать программисту написать по своей стратегии или своим формулам? Кому принадлежат права, заказчику или исполнителю? На мой взгляд рассуждения ни о чём…
 

mobidik

-----
На мой взгляд рассуждения ни о чём…
Знаешь, я соглашусь с этим. Можно говорить много и о высоком, а выхлоп будут один и тот же...

PS.
Кстати, место авторства уже занято по умолчанию :)
 

Вложения

  • AAA.png
    AAA.png
    34 КБ · Просмотры: 33

griz

Активный участник
Как контролировать кол-во вызовов функции OnChartEvent() ?

Ситуация такая:
В процессе изменения текста в объекте OBJ_EDIT, ф-я OnChartEvent() вызывается 4 раза:
1-й раз "Перетаскивание графического объекта",
2-й раз "Нажатие мышки на графическом объекте",
3-й раз "Нажатие мышки на графике",
4-й раз "Окончание редактирования текста в графическом объекте Edit"

Как сделать, чтобы ф-я OnChartEvent() вызывалась один раз при событии "Окончание редактирования текста в графическом объекте Edit"?

А то, получается так: я изменяю текст в объекте OBJ_EDIT и при этом еще вызываются мои пользовательские ф-и, которые находятся на событии "Перетаскивание графического объекта".
 

AlexeyVik

Программист mql4 mql5
Как контролировать кол-во вызовов функции OnChartEvent() ?

Ситуация такая:
В процессе изменения текста в объекте OBJ_EDIT, ф-я OnChartEvent() вызывается 4 раза:
1-й раз "Перетаскивание графического объекта",
2-й раз "Нажатие мышки на графическом объекте",
3-й раз "Нажатие мышки на графике",
4-й раз "Окончание редактирования текста в графическом объекте Edit"

Как сделать, чтобы ф-я OnChartEvent() вызывалась один раз при событии "Окончание редактирования текста в графическом объекте Edit"?

А то, получается так: я изменяю текст в объекте OBJ_EDIT и при этом еще вызываются мои пользовательские ф-и, которые находятся на событии "Перетаскивание графического объекта".
Внутри OnChartEvent() поставь условие
Код:
if(id == CHARTEVENT_OBJECT_ENDEDIT)
 {
 // тут что надо выполнять по окончанию редактирования текста в поле ввода
 }
docs.mql4.com/ru/basis/function/events
 
Последнее редактирование модератором:
Верх