Вопросы по MQL4

Тема в разделе "В помощь трейдеру", создана пользователем ddos1, 20 Декабрь 2014.

  1. ddos1

    ddos1 Постоялец Аргонавт

    Регистрация:
    2 Октябрь 2014
    Сообщения:
    64
    Симпатии:
    66
    Баллы:
    40
    Пол:
    Мужской
    Я на Forex с:
    2013
    А можно более подробно разъяснить этот код, пожалуйста?
     
  2. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.091
    Симпатии:
    4.734
    Баллы:
    585
    Пол:
    Мужской
    Более подробно не получится. Функции RegisterWindowMessageW и PostMessageW виндовые, к MQL не имеют отношения. Использование их в МТ недокументировано.
    Способ один - брать образцы кода, которые работают и экспериментировать.
     
    Dmitri нравится это.
  3. Yura Vakulenko

    Yura Vakulenko Интересующийся - ARGOLab.net -

    Регистрация:
    20 Ноябрь 2013
    Сообщения:
    13
    Симпатии:
    4
    Баллы:
    23
    Пол:
    Мужской
    ребята, привет!
    Помогите сделать так, чтобы советник открывал и закрывал сделки по стрелкам.. (воявилась стрелка вверх - открывает покупки и закрывает продажи, если такие есть.. и наоборот) стрелки не рисуются! и появляются на 1-м баре.. по открытию текущего. НУЖНО ЧТОБЫ ТОРГОВАЛ СОВЕТНИК ТОЛЬКО ПО ОТКРЫТИЮ ТЕКУЩЕГО БАРА. Это простейший советник для проверки мат. ожидания от торговли чисто по сигналам индикатора. Сделки открываются с фикс. лотом. Без ТП и СЛ.

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

    а это мой код советника.
    Код:
    //+------------------------------------------------------------------+
    //|                                               indicator_test.mq4 |
    //|                                                                  |
    //|                                                                  |
    //+------------------------------------------------------------------+
    #property copyright ""
    #property link      ""
    //--------------------------------------------------------------------
    extern int     SmoothPeriod         = 5,
                   SmoothMethod         = 1,
                   Notify               = 0;
    extern double  stoploss             = 0,
                   takeprofit           = 0,
                   TrailingStop         = 0;
    extern double  LOT                  = 0.1;
    extern bool    Close_on_Oposite     = true;
    extern bool    Buy_allow            = true;
    extern bool    Sell_allow           = true;
    //--------------------------------------------------------------------
    int STOPLEVEL,Magic=1234567890;
    
    //--------------------------------------------------------------------
    
    int OnInit()
      {
      
       return(INIT_SUCCEEDED);
      }
    void OnDeinit(const int reason)  {  }
    
    
    int start()
    {
       int timeprev=0;
       if (timeprev == Time[0]) return (0);
       timeprev = Time[0];
       //if (!NewBar()) return;
       STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
       if (TrailingStop>=STOPLEVEL) TrailingStop();
       //if (TimeBar==Time[0]) return(0);
       double bufBuy, bufBuy2,bufSell,bufSell2;
      
       bufBuy   = iCustom(NULL,0,"Arrows",SmoothPeriod,0,1);
       bufSell  = iCustom(NULL,0,"Arrows",SmoothPeriod,1,1);
      
      
      
      
       //bufBuy   = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,1);
       //bufBuy2   = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,2);
       //bufSell  = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,1);
       //bufSell2  = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,2);
      
       double SL,TP;
       //if (Buy_allow)
       //{
          if (bufBuy != EMPTY_VALUE && bufSell == EMPTY_VALUE )//if (bufBuy==bufSell && bufSell2 !=EMPTY_VALUE && bufBuy2 == EMPTY_VALUE)
          {
             if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
             if (stoploss!=0)   SL  = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
             if (Close_on_Oposite) CLOSEORDER(OP_SELL);
             int tik_buy = OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),2,SL,TP,"Ind check buy",Magic,0,clrBlue);
             if(tik_buy>0)
               {
                if(OrderSelect(tik_buy,SELECT_BY_TICKET,MODE_TRADES))
                   Print("BUY order #",tik_buy," opened : ",OrderOpenPrice());
               }
              else
                Print("Error opening BUY order #",tik_buy," : ",GetLastError());
             
            
          }
       //}
    
       //if (Sell_allow)
       //{
          if (bufSell != EMPTY_VALUE && bufBuy == EMPTY_VALUE)//if (bufBuy==bufSell && bufSell2 ==EMPTY_VALUE && bufBuy2 != EMPTY_VALUE)
          {
             if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
             if (stoploss!=0)   SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
             if (Close_on_Oposite) CLOSEORDER(OP_BUY);
             int tik_sell = OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),2,SL,TP,"Ind check sell",Magic,0,clrRed);
             if(tik_sell>0)
               {
                if(OrderSelect(tik_sell,SELECT_BY_TICKET,MODE_TRADES))
                   Print("SELL order #",tik_sell," opened : ",OrderOpenPrice());
               }
             else
                Print("Error opening SELL order #",tik_sell," : ",GetLastError());
            
            
          }
       //}  
      
    return (0);
    }
    //--------------------------------------------------------------------
    void CLOSEORDER(int ord)
    {
       for (int i=0; i<OrdersTotal(); i++)
       {                                              
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          {
             if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
             {
                if (OrderType()==OP_BUY && ord==OP_BUY)
                   OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
                if (OrderType()==OP_SELL && ord==OP_SELL)
                   OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
             }
          }  
       }
    }
    //--------------------------------------------------------------------
    void TrailingStop()
    {
       int tip,Ticket;
       double StLo,OSL,OOP;
       for (int i=0; i<OrdersTotal(); i++)
       {  if (OrderSelect(i, SELECT_BY_POS)==true)
          {  tip = OrderType();
             if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
             {
                OSL   = NormalizeDouble(OrderStopLoss(),Digits);
                OOP   = NormalizeDouble(OrderOpenPrice(),Digits);
                Ticket = OrderTicket();
                if (tip==OP_BUY)            
                {
                   StLo = NormalizeDouble(Bid-TrailingStop*Point,Digits);
                   if (StLo > OSL && StLo > OOP)
                   {  if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
                         Print("TrailingStop Error ",GetLastError()," buy SL ",OSL,"->",StLo);
                   }
                }                                        
                if (tip==OP_SELL)       
                {
                   StLo = NormalizeDouble(Ask+TrailingStop*Point,Digits);
                   if (StLo > OOP || StLo==0) continue;
                   if (StLo < OSL || OSL==0 )
                   {  if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
                         Print("TrailingStop Error ",GetLastError()," sell SL ",OSL,"->",StLo);
                   }
                }
             }
          }
       }
    
    }
    
    //--------------------------------------------------------------------
    
    bool     NewBar()
    {
       static datetime new_Bar;                      
       if (new_Bar == Time[1]) return(false);        //Если бар не закрыт - выход
           new_Bar  = Time[1];
    return(true);
    }
     

    Вложения:

    • Arrows.ex4
      Размер файла:
      7,6 КБ
      Просмотров:
      1
  4. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.091
    Симпатии:
    4.734
    Баллы:
    585
    Пол:
    Мужской
    Написать код мало, надо научиться выуживать в нем ошибки - причем самостоятельно. В этом, собственно, программирование и заключается :)
    Мой совет - упростите советник до максимума, выбросив все лишнее. Например, пусть советник только пишет в журнал сообщение, когда увидит сигнал индикатора.
    Когда добьетесь этого, будете потихоньку усложнять советник.

    Код:
    if (bufBuy != EMPTY_VALUE && bufSell == EMPTY_VALUE )
    Такая конструкция требует, чтобы был одновременно сигнал на бай и сигнал на селл, что маловероятно.
     
    Последнее редактирование: 29 Декабрь 2014
  5. ddos1

    ddos1 Постоялец Аргонавт

    Регистрация:
    2 Октябрь 2014
    Сообщения:
    64
    Симпатии:
    66
    Баллы:
    40
    Пол:
    Мужской
    Я на Forex с:
    2013
    Помогите мне разобраться...
    При закрытии советника у меня подвисает терминал а потом в журнале появляется сообщение "2015.01.05 20:47:20.023 Abnormal termination". что это?
     
  6. ddos1

    ddos1 Постоялец Аргонавт

    Регистрация:
    2 Октябрь 2014
    Сообщения:
    64
    Симпатии:
    66
    Баллы:
    40
    Пол:
    Мужской
    Я на Forex с:
    2013
    Ошибку в своем советнике нашел и исправил, но все же что значит это сообщение "Abnormal termination"? в интернете нашел что-то типа это связано с зацикливанием советника, но как от этого защититься не понял, может кто подскажет как?
     
  7. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.091
    Симпатии:
    4.734
    Баллы:
    585
    Пол:
    Мужской
    Да, это действительно может быть связано с зацикливанием советника. Как защититься? - Устранить все потенциально бесконечные циклы в советнике.
     
  8. ddos1

    ddos1 Постоялец Аргонавт

    Регистрация:
    2 Октябрь 2014
    Сообщения:
    64
    Симпатии:
    66
    Баллы:
    40
    Пол:
    Мужской
    Я на Forex с:
    2013
    Здравствуйте. Не могу понять почему так происходит:
    вот код
    Код:
    double i = 0.1;
    double x = 1.5;
    double y = 0;
    double z = 0.15;
    
    y = i*x;
    Print("Y = ",y);
    
    if(y == z) Print("Y = Z");
    if(y < z) Print("Y < Z");
    if(y > z) Print("Y > Z");
    и вот результат
    Что меня смущает? Я ожидал увидеть вместо "Y > Z" это "Y = Z".
    Объясните пожалуйста.
     
  9. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.091
    Симпатии:
    4.734
    Баллы:
    585
    Пол:
    Мужской
    Операции над числами с плавающей точкой всегда выполняются с какой-то точностью. Поэтому операция == (равно) для чисел типа double, вообще говоря, некорректна. Правильно было бы проверять что модуль разности между ними меньше, чем маленькое число.
    В некоторых случаях == для чисел double применять можно, но надо понимать что вы делаете.
    В вашем примере, я думаю, что такой вариант
    Код:
    if (NormalizeDouble(y,Digits) == NormalizeDouble(z,Digits)) Print("Y == Z");
    даст ожидаемый вами результат.
     
    Kozubus и ddos1 нравится это.
  10. ddos1

    ddos1 Постоялец Аргонавт

    Регистрация:
    2 Октябрь 2014
    Сообщения:
    64
    Симпатии:
    66
    Баллы:
    40
    Пол:
    Мужской
    Я на Forex с:
    2013
    Дало)) спасибо!
     
    Dmitri нравится это.
  11. momcom

    momcom Интересующийся - ARGOLab.net -

    Регистрация:
    29 Август 2015
    Сообщения:
    9
    Симпатии:
    5
    Баллы:
    23
    Пол:
    Мужской
    Хочу реализовать в советнике вывод данных в файл, подскажите пожалуйста код.
    Заранее спасибо !
     
    Dmitri нравится это.
  12. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.091
    Симпатии:
    4.734
    Баллы:
    585
    Пол:
    Мужской
    Простейший пример скрипта:
    Код:
    void start() {
       int File=FileOpen("helloworld.txt",FILE_CSV|FILE_WRITE);
       FileWrite(File,"Hello world!!!");
       FileClose(File);
       Alert("OK");
    }
    Файл helloworld.txt ищем в MQL4\Files.

    Более развернутый пример в аттачменте. Выводит детальную информацию по данному символу во внешний файл.
     

    Вложения:

    momcom, Kozubus и Dmitri нравится это.
  13. momcom

    momcom Интересующийся - ARGOLab.net -

    Регистрация:
    29 Август 2015
    Сообщения:
    9
    Симпатии:
    5
    Баллы:
    23
    Пол:
    Мужской
    Спасибо!
    Вот получилось очень простая конструкция советника, для понимания основного принципа создания и добавления информации в файл.


    Код:
    //+------------------------------------------------------------------+
    //|                                                         File.mq4 
    //| Создает файл "Терминал\MQL4\Files\Название файла.txt"            
    //| если запускаем в тестере то "Терминал\tester\files\Название файла.txt"          
    //+------------------------------------------------------------------+
    #property copyright "All rights reserved.© 2015 ARGO Lab."
    #property link      "http://forumargolab.net"
    #property strict 
    //==Настройки==//
    input string File_Name  = "..."; //Пропишем название файла
    //+------------------------------------------------------------------+
    int start()
      {
    //--ФОРМИРУЕМ ДАННЫЕ
    string Info = "Привет трейдер!!!";//Информация для первой строки файла
    string Symbols = Symbol();//Информация для второй строки файла
    double  Bid_W = Bid;//Информация для nhtnmtq строки файла
    //--ВВОДИМ В ФУНКЦИЮ ДАННЫЕ
    File_W(Info,Symbols,Bid_W);
    return(0);
      }
    //+------------------------------------------------------------------+ 
    //==ФУНКЦИЯ СОЗДАНИЯ ФАЙЛА==//
    void File_W(string info, string symbols, double bid_w)export // Создаем функцию записи данных в файл
    {
       int File=FileOpen(File_Name+".txt",FILE_WRITE|FILE_CSV);// Создаёт файл с заданным, в пользовательских настройах, именем.
       FileWrite(File,info);// Запись первой строки в файл.
       FileWrite(File,symbols);// Запись второй строки в файл. 
       FileWrite(File,bid_w);// Запись третьей строки в файл.
       FileClose(File);//закрываем файл
       Alert("Данные записаны в файл. ");
    }
    //--
     
    loopsider нравится это.
  14. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.091
    Симпатии:
    4.734
    Баллы:
    585
    Пол:
    Мужской
    Только не забываем, что если это советник, то он будет перезаписывать файл на каждом тике. И выбрасывать алерт тоже на каждом тике.
     
  15. momcom

    momcom Интересующийся - ARGOLab.net -

    Регистрация:
    29 Август 2015
    Сообщения:
    9
    Симпатии:
    5
    Баллы:
    23
    Пол:
    Мужской
    Не могу додуматься как сделать счетчик проходов при оптимизации.
    вот код советника:
    Код:
    //+------------------------------------------------------------------+
    //|                                                       Prohod.mq4 |
    //|                             All rights reserved.© 2015 ARGO Lab. |
    //|                                             https://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "All rights reserved.© 2015 ARGO Lab."
    #property link      "http://forumargolab.net"
    #property version   "1.00"
    #property strict
    
    input bool File_load                   =true;    // Разрешить запись в файл
    input string NameFilrs                 = "...";  //Пропишем имя файла для сбора данных
    input int Xr                           = 2;      //Переменная для изменений
    //---
    int BarsNx;         // вспомогательная переменная для определения нового бара
    int Sis1=0,Sis2=0; //
    int Counter=0;     // начальное положение счетчика
    int CounterNx;     // вспомогательная переменная для определения нового прохода
    datetime Times_a=0;//переменная даты начала тестировангия
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int OnInit()
      {
    //---
      
    //---
       return(INIT_SUCCEEDED);
      }
    
    //+------------------------------------------------------------------+
    //| Expert tick function                                             |
    //+------------------------------------------------------------------+
    int start()
      {
    //---
      int BarsN = 0;
      if( BarsNx <= Bars){BarsN = 1;BarsNx = Bars;} // новый бар BarsN=1
    //---
    //int Y=Xr+1;
      string Symbols=Symbol();
      int Periods=Period();
     
      if (BarsN && Open[1]>Close[1])Sis1++; //подсчет шортов
      if (BarsN && Open[1]<Close[1])Sis2++; //подсчёт лонгов
    File_W(File_load, Symbols, Periods, Sis1, Sis2);//
    //WritingLineInFile( NameFilrs, Sis1);
    //---
    if( BarsNx == Bars)BarsNx++;
    return(0); 
      }
    //+------------------------------------------------------------------+
    
    void File_W(double file_load, string symbols, int period, int sis1, int sis2)export // Создаем функцию записи данных в файл
    {
    if(file_load)
    
    {
      if(!Times_a )Times_a=(datetime)TimeCurrent(); //во всех строках начало тестоваго периода будет указано значение сформированное при начале первого прохода
     
       int File=FileOpen((string)NameFilrs + ".txt",FILE_READ|FILE_WRITE|FILE_CSV);// Создаёт файл с заданным, в пользовательских настройах, именем.
      if (File>0) // если файл сформировался то заносим в него значения
      {
       if(CounterNx<Counter){ FileSeek(File, 0, SEEK_END); CounterNx=Counter;} // Начинаем новую строку если счетчик указывает на начало нового прохода
       
       FileWrite(File,(string)Counter  +";"+        //Номер прохода
       (string)symbols +";"+                        //Торговый инструмент
       "M"+(string)period +";"+                         //Таймфрейм
       (string)Times_a +";"+                        //Начало тестового периода
       (string) TimeCurrent() +";"+                 //Окончание тестового периода
       (string)sis1 +";"+                           //Всего шортов
       (string)sis2);                               //Всего лонгов
    
       FileClose(File);//закрываем файл
      
      }
    }
    }
    здесь главное организовать запись в файл данных с новой строки только при следующем проходе в режиме "оптимизация".
    то что некоторые данные переписываются в строке - это не фатально, когда будет работать счетчик можно будет сделать однократную запись строки.
     
  16. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.091
    Симпатии:
    4.734
    Баллы:
    585
    Пол:
    Мужской
    Зачем вы пишите в файл на каждом тике? Этого точно делать не стоит.
    Насчитайте что вам надо и запишите в файл в конце тестирования (в deinit). Записываете в конец файла - и никаких счетчиков проходов не нужно.
    Вот как у меня было сделано:
    Код:
    void deinit() {
       timeEnd = TimeCurrent();
       string str = " "+TimeToStr(timeStart,TIME_DATE)+" - "+TimeToStr(timeEnd,TIME_DATE)
             +" trades: "+convertS(nTot,6)+" profit: "+convert(profitTot,10,1);
       if (lossTot != 0) {
          str = str +" gain/loss = "+convert(gainTot/lossTot,7,3);
       }
    
       str = str + " BandsPeriod = " + BandsPeriod;
       str = str + " BandsDeviations = " + ToStr1(BandsDeviations);
    
       str = str + " MinATRPips = " + ToStr1(MinATRPips);
    
       str = str + " WPRPeriod = " + WPRPeriod;
       str = str + " WPRLevel = " + ToStr1(WPRLevel);
    
       str = str + " SLPips = " + ToStr1(SLPips);
       str = str + " TrailPips = " + ToStr1(TrailPips);
    
       str = str + " SpreadPips = " + ToStr1(SpreadPips);
       Print(str);
    
          // дописываем результат в конец файла
       string FileName = WindowExpertName()+ Symbol() + ".txt";
       int handle=FileOpen(FileName,FILE_CSV|FILE_READ|FILE_WRITE," ");
       if (handle < 0) {
          Print("Error reading/creating file ",FileName);
       } else {
          while (!FileIsEnding(handle)) {
             string data = FileReadString(handle);  
          }
          FileWrite(handle,str);
       }
    }
    
     
    momcom, Pythoha и Kozubus нравится это.
  17. momcom

    momcom Интересующийся - ARGOLab.net -

    Регистрация:
    29 Август 2015
    Сообщения:
    9
    Симпатии:
    5
    Баллы:
    23
    Пол:
    Мужской
    Переделал советник с учетом Вашего примера.
    все работает - Спасибо!
    хотелось бы счетчик прикрутить... в дальнейшем планирую тестить на нем различные индикаторы а их оптимизированные параметры сравнивать с данными из файла. но пока что пусть будет так (в excel перекину а там номера уже есть):)

    Код:
    //+------------------------------------------------------------------+
    //|                                                     Prohod_2.mq4 |
    //|                             All rights reserved.© 2015 ARGO Lab. |
    //|                                             https://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "All rights reserved.© 2015 ARGO Lab."
    #property link      "http://forumargolab.net"
    #property version   "1.00"
    #property strict
    
    input bool File_load                   =true;    // Разрешить запись в файл
    input string FileName                 = "...";  //Пропишем имя файла для сбора данных
    input int Xr                           = 2;      //Переменная для изменений
    //---
    int BarsNx;         // вспомогательная переменная для определения нового бара
    int Sis1=0,Sis2=0;  // переменные для вывода информации в файл
    int TimeStart=0;    // переменная для определения старта советника
    datetime TimeStartN;//вспомогательная переменная для определения старта советника
      int Counter=0;     // начальное положение счетчика
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int OnInit()
      {
    //---
    
    //---
       return(INIT_SUCCEEDED);
      }
    
    //+------------------------------------------------------------------+
    //| Expert tick function                                             |
    //+------------------------------------------------------------------+
    int start()
      {
    //---
      int BarsN = 0;
      if( BarsNx <= Bars){BarsN = 1;BarsNx = Bars;} // новый бар BarsN=1
    //---
    //int Y=Xr+1;
      string Symbols=Symbol();
      int Periods=Period();
     
      if (BarsN && Open[1]>Close[1])Sis1++; //подсчет шортов
      if (BarsN && Open[1]<Close[1])Sis2++; //подсчёт лонгов
      if(!TimeStart){TimeStartN = TimeCurrent();TimeStart=1;}// время старта эксперта TimeStartN
    //---
    if( BarsNx == Bars)BarsNx++;
    return(0); 
      }
    //+------------------------------------------------------------------+
    
    void deinit()
    {
        //определяем диапазон премени работы советника
       string Times_Start_End = " "+TimeToStr(TimeStartN,TIME_DATE)+" - "+TimeToStr(TimeCurrent(),TIME_DATE);
     
       //формируем данные для занесения в файл
       string   str = " номер прохода = " + (string)Counter;
       str = str + " всего шортов = " + (string)Sis1;
       str = str + " всего лонгов = " + (string)Sis2; 
    //   Print(str);
          
       //формируем имя файла из имени заданным в настройках + инструмента + таймфрейм + диапазон тестового периода  
       string FileNameN = FileName+"_"+ Symbol()+"_M"+(string)Period()+"_"+(string)Times_Start_End+ ".txt";
       int handle=FileOpen(FileNameN,FILE_CSV|FILE_READ|FILE_WRITE," ");
       if (handle < 0)
       {
        Print("Error reading/creating file ",FileName);
       }
       // дописываем результат в конец файла
       else
        {
          while (!FileIsEnding(handle))
          {
           string data = FileReadString(handle);
          }
         
           FileWrite(handle,str);
          
        }
    }
     

    Вложения:

    • Prohod_2.mq4
      Размер файла:
      3,1 КБ
      Просмотров:
      1
    loopsider нравится это.
  18. Trader 007

    Trader 007 Новичок

    Регистрация:
    4 Декабрь 2015
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Пол:
    Мужской
    Я на Forex с:
    2005
    Добрый день!
    А возможно ли в советник кнопки BUTTON из Пожалуйста, войдите или зарегистрируйтесь для просмотра ссылок добавить код из Пожалуйста, войдите или зарегистрируйтесь для просмотра ссылок так, чтобы при нажатии на кнопку на графике торгового инструмента запускался скрипт к которому установлены горячие клавиши , вместо прорисовки го
    графического черного квадрата?

    Т.е. совентик в виде кнопки на графике, при нажатии на которую запускается нужный скрипт?

    Буду очень благодарен за помощь в модернизации кода.
     
    Последнее редактирование модератором: 21 Декабрь 2015
  19. Trader 007

    Trader 007 Новичок

    Регистрация:
    4 Декабрь 2015
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Пол:
    Мужской
    Я на Forex с:
    2005
    Создаётся впечатление, что то что предлагаете сами не в состоянии применить. ))

    Закономерный вопрос, а зачем тогда?
    В чём смысл?
     
  20. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.091
    Симпатии:
    4.734
    Баллы:
    585
    Пол:
    Мужской
    Вы обратились с просьбой. Никто не сказал, что кто-то ее выполнит. Тем более, что просьба странная и никому кроме вас это явно не понадобится. Хотите результат - предложите небольшую денежку на фрилансе, или разберитесь немного в mql сами.
     

Поделиться этой страницей