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

Andy200577

Новичок форума
Подскажите пожалуйста ответ на следующий думаю простой вопрос относительно чтения текстового файла. Предположим его содержание простой произвольный набор символов в 3 строки:
21sdfsdf
3323dscdc
fg3vg7hhy

Почему то никак не удаётся добиться, чтобы читались все строки кроме первой:
int handle;
handle=FileOpen("11.txt",FILE_TXT|FILE_READ);
Print(FileReadString(handle));
if (handle != -1) FileClose(handle);

В описании FileReadString написано - "Читает из файла строку с текущего положения файлового указателя." А что такое текущее положение указателя? Каким образом нужно перебирать строки для чтения?
Заранее спасибо.
 

zhserg

Местный знаток
Каким образом нужно перебирать строки для чтения?

С помощью цикла. в документации ведь и пример есть. Вот
PHP:
      //--- прочитаем данные из файла
      while(!FileIsEnding(file_handle))
        {
         //--- узнаем сколько символов использовано для записи времени
         str_size=FileReadInteger(file_handle,INT_VALUE);
         //--- прочитаем строку
         str=FileReadString(file_handle,str_size);
         //--- распечатаем строку
         PrintFormat(str);
        }
 

terron2006

Прохожий
Мастера помогите разобраться с функцией закрытия ордеров в наглядной форме на примере советника, ибо иначе до меня не доходит :please:
Ниже код советника, сам советник и индикатор, просьба написать в советнике закрытие ордера, к примеру при закрытии свечи на которой произошел вход в сделку.
Код:
//+------------------------------------------------------------------+
//|                                                   Experts111.mq4 |
//|                                                             dums |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "dums"
#property link      ""
#property version   "1.00"
#property strict
extern int    WATR_K = 10;
extern double WATR_M = 4.0;
extern int    ATR=21;
extern int Magic = 123;
extern double Lot=0.01;
extern int SL = 50;
extern int TP = 150;
double Up,Down;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
int kolpos=0;
   Up=iCustom(Symbol(),0,"WATR",WATR_K,WATR_M,ATR,0,0);
   Down=iCustom(Symbol(),0,"WATR",WATR_K,WATR_M,ATR,1,0);
//---
   for(int pos=0; pos<OrdersTotal(); pos++)
     {
      OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         kolpos++;

     }
   if(kolpos==0)

     {
      if(Down<=Ask && Close[1]<Down)
         OrderSend(Symbol(),OP_BUY,Lot,Ask,10,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,Green);

     }
   return;   
  }
//+------------------------------------------------------------------+
 

Вложения

  • Experts111.mq4
    2 КБ · Просмотры: 26
  • WATR.mq4
    5,1 КБ · Просмотры: 26

jekk

Прохожий
МА 240 ее уровни +200 и - 200 в MQL 4

Доброе время суток! Помогите, пожалуйста. Как можно прописать в советнике сигнал пересечение цены с уровнем +200 (МА 240) на покупку и с уровнем -200 на продажу. Кто знает можно в личку E-mail: [email protected] Благодарю заранее! С уважением, Евгений!
 

Ugar

Гуру форума
Доброе время суток! Помогите, пожалуйста. Как можно прописать в советнике сигнал пересечение цены с уровнем +200 (МА 240) на покупку и с уровнем -200 на продажу. Кто знает можно в личку E-mail: [email protected] Благодарю заранее! С уважением, Евгений!
Что не ясно, как уровни вычислить или как условие пересечения прописывать?
 

Капиталист

Активный участник
Здравствуйте доктора скажите пожалуйста Что означает эта ошибка
08:23:12.277 '261910': order buy stop 0.01 EURUSD opening at 1.37209 sl: 0.00000 tp: 0.00000 failed [Invalid S/L or T/P]
08:23:12.481 '261910': pending order buy stop 0.01 EURUSD at 1.37209 sl: 0.00000 tp: 0.00000
И если можете ребята пожалуйста компельните советника под новый билд, а то он совсем не компелируется то есть компилится с ошибками у меня на сервере на 625 билде не знаю в чём проблема может быть в этой ошибке и на ошибки в коде проверте если не сложно?
спасибо:
 

Вложения

  • ,ShockBar v.1.3 (1).mq4
    145,2 КБ · Просмотры: 20
Последнее редактирование:

Ugar

Гуру форума
Здравствуйте доктора скажите пожалуйста Что означает эта ошибка
08:23:12.277 '261910': order buy stop 0.01 EURUSD opening at 1.37209 sl: 0.00000 tp: 0.00000 failed [Invalid S/L or T/P]
08:23:12.481 '261910': pending order buy stop 0.01 EURUSD at 1.37209 sl: 0.00000 tp: 0.00000
Скорее всего советник пытается ставить отложенный ордер слишком близко к текущей цене, не проверив возможно ли это.
Вряд ли это связано с новым билдом, скорее всего этой проверки программист вообще не предусматривал. Исправление ошибок, связанных с тем что не компилируется на новом билде, вряд ли поможет от этой ошибки.
 

tommy27

Гуру форума
Надеюсь не все ещё разъехались по отдыхаловкам и дачам.. нужна помощь:
Не знаю как сделать в индикаторе так, чтобы он сравнивал несколько идущих друг за другом сигналов от его же двух буферов и в новом буфере ставил бы или не ставил стрелки по всей истории показаний, в зависимости от результата сравнения.. как бы объяснить получше... попробую на примере использования индикатора фракталов для отрисовки стрелки в надежде на продолжение тренда - на картинке.
qqmber ранее выкладывал функции для определения параметров заданной стрелки:
PHP:
//////
int ArrowUpN(int n) {
int cnt=0;
for(int i=0; i<200; i++) {
   if(Up[i]!=0) cnt++;
   if(cnt==n) return(i+2); 
   }
return(-1);
}
//////
int ArrowDoN(int n) {
int cnt=0;
for(int i=0; i<200; i++) {
   if(Dn[i]!=0) cnt++;
   if(cnt==n) return(i+2); 
   }
return(-1);
}
можно сделать с их помощью, но тогда по моему при запуске индюка будет анализироваться только последние фракталы, а надо чтоб анализ с отрисовкой стрелок был по всей истории. HELP!
 

Вложения

  • HELP.png
    HELP.png
    29,6 КБ · Просмотры: 27

tommy27

Гуру форума
Вот такие мысли появились: ...допустим, что все фракталы хранятся в одном буфере индюка, тогда может быть сделать массив размером к примеру [1000] и загнать туда Time[] всех баров с фракталами, а потом в отдельном цикле уже определять - если значение выше хая значит верхний, ниже-нижний и далее сравнивать соседние ячейки на предмет нужной конфигурации... как то так.. или может есть вариант проще.. а если лучше так, то как..?
 

Alekcc

Почетный гражданин
индикаторы

Добрый вечер.
Подскажите пожалуйста , что нужно делать при таком коде и ошибках при переводе в 646 билд.
Заранее благодарен.
============================
IndicatorShortName("5_34_5");

SetIndexDrawBegin(0,TrendBuffer);
SetIndexDrawBegin(1,LoBuffer);

return(0);
}
===================================
'TrendBuffer' - invalid array access 5_34_5.mq4 44 24
'LoBuffer' - invalid array access 5_34_5.mq4 45 24
2 error(s), 0 warning(s) 3 1
 

Ugar

Гуру форума
Добрый вечер.
Подскажите пожалуйста , что нужно делать при таком коде и ошибках при переводе в 646 билд.
Заранее благодарен.
============================
IndicatorShortName("5_34_5");

SetIndexDrawBegin(0,TrendBuffer);
SetIndexDrawBegin(1,LoBuffer);

return(0);
}
===================================
'TrendBuffer' - invalid array access 5_34_5.mq4 44 24
'LoBuffer' - invalid array access 5_34_5.mq4 45 24
2 error(s), 0 warning(s) 3 1
В этом коде ничего не надо делать.
Приводить надо весь код. А начинать искать ошибки стоит с 44 и 45 строчек.
 

tommy27

Гуру форума
Загнал дату и цену фракталов в массивы, а значения в них с появлением очередного фрактала почему то не обновляются, только если ТФ попереключать обновятся. Что не так сделал?
PHP:
//+------------------------------------------------------------------+
//|                                                    iFractals.mq4 |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 RoyalBlue
#property  indicator_width1  1
#property  indicator_width2  1

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[],buf;

double bufUpPrice[500];  //массив цен Up фракталов
double bufUpDate[500];   //массив дат Up фракталов
double bufDownPrice[500];   //массив цен Down фракталов
double bufDownDate[500]; //массив дат Down фракталов
int Up = 0; //счетчик Up фракталов
int Down = 0;  //счетчик Down фракталов
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexArrow(0,217);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexEmptyValue(0, 0.0);
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexArrow(1, 218);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexEmptyValue(1, 0.0);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("iFractals");
   SetIndexLabel(0, "iFractalsUp");
   SetIndexLabel(1, "iFractalsDn");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars = IndicatorCounted();
//----
     int limit;
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars > 0) 
         counted_bars--;
     limit = Bars - counted_bars;
  //---- основной цикл
     for(int i = 2; i < limit; i++)
       {
         ExtMapBuffer1[i] = iFractals(NULL, 0, MODE_UPPER, i);
         buf=iFractals(NULL, 0, MODE_UPPER, i);
         if (buf!=0)
          {
            Up++;
            bufUpPrice[Up]=iFractals(NULL, 0, MODE_UPPER, i);
            bufUpDate[Up]=Time[i];
          }
         ExtMapBuffer2[i] = iFractals(NULL, 0, MODE_LOWER, i);
         buf=iFractals(NULL, 0, MODE_LOWER, i);
         if (buf!=0)
          {
            Down++;
            bufDownPrice[Down]=iFractals(NULL, 0, MODE_LOWER, i);
            bufDownDate[Down]=Time[i];
          }
          
        
        }
    
    if(IsNewBar()){RefreshRates();coment();}
        
//----
   return(0);
  }
//+------------------------------------------------------------------+
////////////////////
bool IsNewBar()
 {
  static int nBars = 0;
  if (nBars == 0) 
   {
    nBars = Bars;
    return(false);
   }
  if (nBars != Bars)
   {
    nBars = Bars;
    return(true);
   }
  return(false);
 }
////////////////////
void coment()
{
 string st=
            bufUpPrice[1]+" - "+bufUpDate[1]+"\n"+
            bufUpPrice[2]+" - "+bufUpDate[2]+"\n"+
            bufUpPrice[3]+" - "+bufUpDate[3]+"\n"+
            
            bufDownPrice[1]+" - "+bufDownDate[1]+"\n"+
            bufDownPrice[2]+" - "+bufDownDate[2]+"\n"+
            bufDownPrice[3]+" - "+bufDownDate[3];
         Comment(st);
 
}
 

kot287

Активный участник
Уважаемые! Нет ли у кого фукции корреляции 2-х ФИ?
 

AlexeyVik

Программист mql4 mql5
Загнал дату и цену фракталов в массивы, а значения в них с появлением очередного фрактала почему то не обновляются, только если ТФ попереключать обновятся. Что не так сделал?
PHP:
//+------------------------------------------------------------------+
//|                                                    iFractals.mq4 |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 RoyalBlue
#property  indicator_width1  1
#property  indicator_width2  1

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[],buf;

double bufUpPrice[500];  //массив цен Up фракталов
double bufUpDate[500];   //массив дат Up фракталов
double bufDownPrice[500];   //массив цен Down фракталов
double bufDownDate[500]; //массив дат Down фракталов
int Up = 0; //счетчик Up фракталов
int Down = 0;  //счетчик Down фракталов
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexArrow(0,217);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexEmptyValue(0, 0.0);
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexArrow(1, 218);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexEmptyValue(1, 0.0);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("iFractals");
   SetIndexLabel(0, "iFractalsUp");
   SetIndexLabel(1, "iFractalsDn");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars = IndicatorCounted();
//----
     int limit;
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars > 0) 
         counted_bars--;
     limit = Bars - counted_bars;
  //---- основной цикл
     for(int i = 2; i < limit; i++)
       {
         ExtMapBuffer1[i] = iFractals(NULL, 0, MODE_UPPER, i);
         buf=iFractals(NULL, 0, MODE_UPPER, i);
         if (buf!=0)
          {
            Up++;
            bufUpPrice[Up]=iFractals(NULL, 0, MODE_UPPER, i);
            bufUpDate[Up]=Time[i];
          }
         ExtMapBuffer2[i] = iFractals(NULL, 0, MODE_LOWER, i);
         buf=iFractals(NULL, 0, MODE_LOWER, i);
         if (buf!=0)
          {
            Down++;
            bufDownPrice[Down]=iFractals(NULL, 0, MODE_LOWER, i);
            bufDownDate[Down]=Time[i];
          }
          
        
        }
    
    if(IsNewBar()){RefreshRates();coment();}
        
//----
   return(0);
  }
//+------------------------------------------------------------------+
////////////////////
bool IsNewBar()
 {
  static int nBars = 0;
  if (nBars == 0) 
   {
    nBars = Bars;
    return(false);
   }
  if (nBars != Bars)
   {
    nBars = Bars;
    return(true);
   }
  return(false);
 }
////////////////////
void coment()
{
 string st=
            bufUpPrice[1]+" - "+bufUpDate[1]+"\n"+
            bufUpPrice[2]+" - "+bufUpDate[2]+"\n"+
            bufUpPrice[3]+" - "+bufUpDate[3]+"\n"+
            
            bufDownPrice[1]+" - "+bufDownDate[1]+"\n"+
            bufDownPrice[2]+" - "+bufDownDate[2]+"\n"+
            bufDownPrice[3]+" - "+bufDownDate[3];
         Comment(st);
 
}
Фракталы на нулевом баре не бывают. Или на втором, но может и пропасть или на третьем, не пропадёт. Соответственно фрактал надо искать на i+2 или i+3 баре.
 

tommy27

Гуру форума
Фракталы на нулевом баре не бывают. Или на втором, но может и пропасть или на третьем, не пропадёт. Соответственно фрактал надо искать на i+2 или i+3 баре.
так и есть:
PHP:
for(int i = 2; i < limit; i++)
в общем то решение уже нашел, но почему не обновляются массивы всё таки не пойму, хоть они уже и не нужны, но хотелось бы разобраться на будущее
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
так и есть:
PHP:
for(int i = 2; i < limit; i++)
в общем то решение уже нашел, но почему не обновляются массивы всё таки не пойму, хоть они уже и не нужны, но хотелось бы разобраться на будущее
Ну я не подумал что можно и так написать, поэтому и не обратил внимания.
Код:
[COLOR=#000000][COLOR=#0000BB]int counted_bars [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]IndicatorCounted[/COLOR][COLOR=#007700](); 
[/COLOR][COLOR=#FF8000]//---- 
     [/COLOR][COLOR=#0000BB]int limit[/COLOR][COLOR=#007700]; 
  [/COLOR][COLOR=#FF8000]//---- последний посчитанный бар будет пересчитан 
     [/COLOR][COLOR=#007700]if([/COLOR][COLOR=#0000BB]counted_bars [/COLOR][COLOR=#007700]> [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700])  
         [/COLOR][COLOR=#0000BB]counted_bars[/COLOR][COLOR=#007700]--; 
     [/COLOR][COLOR=#0000BB]limit [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Bars [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000BB]counted_bars[/COLOR][COLOR=#007700]; 
  [/COLOR][COLOR=#FF8000]//---- основной цикл 
     [/COLOR][COLOR=#007700]for([/COLOR][COLOR=#0000BB]int i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]< [/COLOR][COLOR=#0000BB]limit[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]++) 
       { [/COLOR][/COLOR]
int counted_bars = IndicatorCounted() это количество посчитанных баров. Соответственно когда все бары посчитаны то limit будет равен нулю. А ты цикл поставил от i = 2 пока i меньше нуля... Да ещё и увеличение i++
 
Последнее редактирование:

abuuuuuu

Местный знаток
как написать стрелочный советник или у кого то есть шаблон только не предлагайте exp_icustom заранее благодарен
 

Ugar

Гуру форума
как написать стрелочный советник или у кого то есть шаблон только не предлагайте exp_icustom заранее благодарен
1 варинт:
a) Выучить язык программирования
б) сформулировать алгоритм работы советника
в) написать и проверить

2 варинт:
а) сформулировать алгоритм работы советника
б) Обратиться с просьбой написать бесплатно в ветку
http://forexsystemsru.com/yazyk-pro...edlozheniya-po-avtomatizacii-torgovli-13.html
в) Подождать. Может кому то из программистов станет интересно, тогда напишут.

Есть ещё платный вариант, но ему здесь не место.
 

ansol

Местный знаток
как написать стрелочный советник или у кого то есть шаблон только не предлагайте exp_icustom заранее благодарен

"Стрелочный" - это что значит? Может вам следует с объекта "стрелка" брать данные и на ейной основе открывать сделки? Оно?
Тогда посмотрите список объектов в свойствах графика и выберите нужные(которые "стрелки")
Или объясняйте толком, что нужно
 

abuuuuuu

Местный знаток
"Стрелочный" - это что значит? Может вам следует с объекта "стрелка" брать данные и на ейной основе открывать сделки? Оно?
Тогда посмотрите список объектов в свойствах графика и выберите нужные(которые "стрелки")
Или объясняйте толком, что нужно

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