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

commready

Прохожий
Это переменная, она не открывает ордера, ей всего лишь присваивается значение.

В этой функции, возможно, осуществляется сдвиг времени. Ордера она не открывает и даже не считает их.

Один крокодил красный, другой налево. Помогите посчитать, сколько стоит ящик жареных гвоздей.

спасибо
 

ksardas

Гуру форума
Вот спасибо mobidik!!!
Теперь все верно работает! и можно не сравнивать и не считать. забить все условия и посмотреть, Красота!!!!!
 

Rost

Новичок форума
Подскажите, пожалуйста, как мне в советнике определить datetime начала текущего месяца:
datetime dt = ???
 

_SERG_

Активный участник
Подскажите, пожалуйста, как мне в советнике определить datetime начала текущего месяца:
datetime dt = ???


double iOpen(
string symbol, // символ
int timeframe, // период
int shift // сдвиг
);




PERIOD_MN1
43200
1 месяц

datetime dt = iOpen(Symbol(),PERIOD_MN1,0);



как вариант, где-то так.
 

_SERG_

Активный участник
Накачука и я вопросик. :)
Ну, с динамическим именем переменой вопросов нет, а вот с динамическим именем массива ну никак. Поделитесь своим опытом люди добрые, кто сталкивался с задачей, и как решал.

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart(){
string AN = "DinArrayName";
double AN [3][4];
ArrayInitialize(AN, 0);
}
//+------------------------------------------------------------------+

Журнал:
'TEST_DINAMIC_ARR_NAME.mq4' TEST_DINAMIC_ARR_NAME.mq4 1 1
'AN' - variable already defined TEST_DINAMIC_ARR_NAME.mq4 15 10
'ArrayInitialize' - no one of the overloads can be applied to the function call TEST_DINAMIC_ARR_NAME.mq4 16 3
2 error(s), 0 warning(s) 3 1
 
Последнее редактирование:

Rost

Новичок форума
Спасибо, ребята! Вы молодцы, быстро и доходчиво.
 

дима1234

Интересующийся
Прошу помощи в написании советника

Приветствую всех
Столкнулся вот с какой проблемой я скопировал с другого рабочего советника функцию задача которой контроль количества открытых ордеров там от куда я ее скопировал она работает а у меня нет вот эта функция
int CountTrades()
{
int count = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
count++;
}
}

return(count);
}
и вызов функции
if (CountTrades() == 0)
я попытался выяснить почему и вот что у меня получилось
если установить ордерсенд между фигурными скобками
if (CountTrades() == 0)
{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE);
}
функция работает как должна а именно если открытых ордеров нет то открывается ордер не важно какой я для примера взял на покупку и вот что получилось ордер открылся и закрылся согласно тейкпрофиту или стоплоссу и только потом открылся следующий ордер мне так и надо
если без фигурных скобак
if (CountTrades() == 0)
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE);
то тогда ордера открываются на каждом тике и не по одному а очень много я решил поставить скобки но когда я пишу условие дальше открываются сразу более 500 ордеров в промежутке 10 пунктов
есть какое то правило выставление фигурных скобак
 

Ugar

Гуру форума
Всё правильно. Если после условия нет фигурных скобок, то выполняется одно действие по условию.
if (CountTrades() == 0) Условие
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits); Действие по условию
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);Действие не зависит от условия
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE);Действие не зависит от условия
Остальные действия выполняются в любом случае, не зависимо от условия.

Если нужно что бы по условию выполнялось несколько действий, тог все эти действия должны быть перечислены внутри фигурных скобок после условия.
if (CountTrades() == 0)Условие
{Все действия внутри скобок выполняются по условию
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE);
}
 
Последнее редактирование:

Алексей 983

Прохожий
Здравствуйте. Пытаюсь разобраться с написанием сов по внешнему индикатору. Получилось,что сов ,когда гистограмма одного цвета-то открывает только sell. Когда цвет меняется- то только buy. Решил вместо гистограммы подставить любой стрелочный индикатор. Сов индикатор видит,только открывает сразу две сделки и buy и sell одновременно и чихать он хотел на сигналы инд. Подскажите пожалуйста что делать!
 

Ugar

Гуру форума
Здравствуйте. Пытаюсь разобраться с написанием сов по внешнему индикатору. Получилось,что сов ,когда гистограмма одного цвета-то открывает только sell. Когда цвет меняется- то только buy. Решил вместо гистограммы подставить любой стрелочный индикатор. Сов индикатор видит,только открывает сразу две сделки и buy и sell одновременно и чихать он хотел на сигналы инд. Подскажите пожалуйста что делать!
Программисты не гадалки. Как могут найти косяк в программе, которую не видят?
 

hoz

Активный участник
Программисты не гадалки. Как могут найти косяк в программе, которую не видят?

Щяс увидят, все увидят... :facepalm:
В общем, несколько дней я уже бьюсь над кодом. И решения пока что не нашёл. Код написан на основе ООП. Но все классы проверены и работают. Проверял всё поочерёдно в процессе написания. Дошёл до очередного класса. Комментируя код класса, я нашёл метод, в котором по какой-то причине появляется ошибка 4059.

Сам код пробемного метода с комментариями вот:
PHP:
// 1.1 Создаём список рабочих инструментов и заносим их в массив. =========================================================================
int MakeListOfInstruments::CreatWorkingSMBArray (string& fsa_WorkingSMB[],           // Возвращаемый массив рабочих инструментов
                                                 string  fs_ListOfWorkingSMB,        // Список рабочих инструментов
                                                 string  fs_BaseCurrency,            // Список базовых валют
                                                 string  fs_BadCurrency,             // "Чёрный" список валют( их пропускаем )
                                                 int     fi_MAXspread = 0,           // Максимальный спред
                                                 string  fs_Delimiter = ",")         // Разделитель элементов в списках
{
   ResetLastError();
   int li_CntOfSMB = 0;

   //---- Формируем лист рабочих символов
   if (fs_ListOfWorkingSMB == "")
   {
      string lsa_AllSymbols[],      // Массив с общим количеством торговых инструментов( в зависимости от выбора источника )
             lsa_ProperCUR[],       // Массив с подходящими торговыми инструментами
             lsa_BadCUR[];          // Массив с НЕподходящими торговыми инструментами
      int    li_CntProperCUR,       // Количество подходящих торговых инструментов
             li_CntBadCUR,          // Количество НЕподходящих торговых инструментов
             li_Cnt = 0,            // Общее количество торговых инструментов котируемых ДЦ
             li_CUR,                // Счётчик подходящих торговых инструментов
             li_BAD;                // Счётчик НЕподходящих торговых инструментов
      bool   lb_BAD;

      //---- Формируем массив из списка базовых валют
      li_CntProperCUR = CArraysMan.MakeStrArrayFromLine (fs_BaseCurrency, lsa_ProperCUR, ",");

      //---- Формируем массив из "чёрного" списка валют
      li_CntBadCUR = CArraysMan.MakeStrArrayFromLine (fs_BadCurrency, lsa_BadCUR, ",");

      //---- Получаем перечень доступных символов в окне "Обзор рынка"
      li_Cnt = ListOfSMB (lsa_AllSymbols, True);

      ArrayResize (fsa_WorkingSMB, li_Cnt);

      if (li_CntProperCUR == 0)
      {
         li_CntProperCUR = 1;
         ArrayResize (lsa_ProperCUR, 1);
      }

      CArraysMan.InitializeArraySTR (fsa_WorkingSMB, "");
Print ("_LastError_1 = ", _LastError);
      //---- Оставляем только те инструменты, в которых присутствуют "доминантные" валюты
      for (int li_SMB = 0; li_SMB < li_Cnt; li_SMB++)
      {
         Print ("li_SMB = ", li_SMB);
         Print ("_LastError_2 = ", _LastError);
         for (li_CUR = 0; li_CUR < li_CntProperCUR; li_CUR++)
         {
            ResetLastError();
            Print ("li_CUR = ", li_CUR);
            Print ("_LastError_3 = ", _LastError);
            if (StringFind (lsa_AllSymbols [li_SMB], lsa_ProperCUR [li_CUR]) >= 0 || fs_BaseCurrency == "")
            {
               Print ("_LastError_6 = ", _LastError);
               if (li_CntBadCUR > 0)
               {
//                //---- Фильтруем инструменты через "чёрный" список
                  lb_BAD = false;
                   
                  for (li_BAD = 0; li_BAD < li_CntBadCUR; li_BAD++)
                  {
                     if (StringFind (lsa_AllSymbols [li_SMB], lsa_BadCUR [li_BAD]) >= 0)
                     {
                        lb_BAD = true; break;
                     }
                  }
                  
                  if (lb_BAD) break;
               }
//               Print ("_LastError_7 = ", _LastError);
               //---- Отбрасываем инструменты с "большим" спредом
               if (MaxSpread > 0)
               {
                  if (  MarketInfo (lsa_AllSymbols [li_SMB], MODE_SPREAD) > MaxSpread)
                  break;
               }
               fsa_WorkingSMB [li_CntOfSMB] = lsa_AllSymbols [li_SMB];
               li_CntOfSMB++;
               break;
            }
         }
      }
      Print ("_LastError_4 = ", _LastError);
      ArrayResize (fsa_WorkingSMB, li_CntOfSMB);
   }
   else
   {
      li_CntOfSMB = CArraysMan.MakeStrArrayFromLine (fs_ListOfWorkingSMB, fsa_WorkingSMB, ",");
      //---- Проверяем на котируемость у ДЦ введённых символов
      li_CntOfSMB = CheckPresenceSMBInMarket (fsa_WorkingSMB);
   }
   //---- Контролируем возможные ошибки
   CLogging.Printing (StringConcatenate ("CreatWorkingSMBArray() => ", CErrs.ErrorToString (_LastError)));
//----
   return (li_CntOfSMB);
}

В логе вижу такую картину:

PHP:
23:37:59 Expert BaseTemplate EURUSD,H1: loaded successfully
23:37:59 TestGenerator: current spread 105 used
23:37:59 BaseTemplate inputs: id_Lots=0.1; id_SL=0; id_TP=10; ii_Slippage=2; ib_Bootstrap=0; ib_RealTrade=1; ib_VirtualTrade=1; ib_NeedLogs=1; ib_PrintUP=1; ib_CommentUP=1; ii_MaxSpread=50; ii_NumberOfTry=10; ib_LotMoreMaxLot=0; 
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: _LastError_1 = 0
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: li_SMB = 0
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: _LastError_2 = 0
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: li_CUR = 0
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: _LastError_3 = 0
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: _LastError_6 = 0
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: li_SMB = 1
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: _LastError_2 = 4059
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: li_CUR = 0
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: _LastError_3 = 0
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: _LastError_6 = 0
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: li_SMB = 2
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: _LastError_2 = 4059
23:37:59 2014.06.24 00:00  BaseTemplate EURUSD,H1: li_CUR = 0
...
...
...

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


Глобальные input-переменные, которые получает данная функция

CreatWorkingSMBArray вот:
PHP:
input string     _Make_List_Of_Symbols =     " ______________ Make List Of Symbols _____________ ";
input string     is_ListOfWorkingSMB = "";           // Список рабочих инструментов
input string     is_ListOfMagic = "3333021";         // Список используемых экспертом магиков
input string     is_BaseCurrencyList = "USD,EUR,JPY,CHF,GBP,CAD,AUD";      // Список базовых валют
input string     is_BadCurrencyList = "NZD";         // "Чёрный" список валют ( их пропускаем )
input int        ii_MaxSpread = 50;                  // Максимальный спред, при котором эксперту разрешено торговать!


А вот 2 функции InitializeArraySTR и MakeStrArrayFromLine, которые в ней используются:

PHP:
// 1.4 Возвращает массив STRING из строки, разделённой fs_Delimiter. ========================================================================
int MakeStrArrayFromLine (string  fs_List,              // строка с данными
                          string& fsa_OUT[],            // возвращаемый массив
                          string  fs_Delimiter = ",")   // разделитель данных в строке
{
   string tmp_Str = "",
          tmp_Char = "";
//----
   ArrayResize (fsa_OUT, 0);
    
   for (int i = 0; i < StringLen (fs_List); i++)
   {
      tmp_Char = StringSubstr (fs_List, i, 1);
    
      if (tmp_Char == fs_Delimiter)
      {
         if (StringTrimLeft (StringTrimRight (tmp_Str)) != "")
         {
            ArrayResize (fsa_OUT, ArraySize (fsa_OUT) + 1);
            fsa_OUT [ArraySize (fsa_OUT) - 1] = tmp_Str;
         }
         tmp_Str = "";
      }
      else
      {
         if (tmp_Char != " ") tmp_Str = tmp_Str + tmp_Char;
      }
   }
    
   if (StringTrimLeft (StringTrimRight (tmp_Str)) != "")
   {
      ArrayResize (fsa_OUT, ArraySize (fsa_OUT) + 1);
      fsa_OUT [ArraySize (fsa_OUT) - 1] = tmp_Str;
   }
//----
   return (ArraySize (fsa_OUT));
}
// 1.3 Инициализируем массив STRING по заданному VALUE. ===================================================================================
void InitializeArraySTR (string& fsa_Array[],     // Инициализируемый массив
                         string  fs_Value = "")   // Значение, которым будем инициализировать массив fsa_Array
{
   for (int li_Int = 0; li_Int < ArraySize (fsa_Array); li_Int++)
   {
      fsa_Array [li_Int] = fs_Value;
   }
}

Что тут не так? Причём в этом моменте кода ошибка 4059 и вообще объекты? Судя по принтам касательно работы метода ошибок быть не должно...

В тестовом режиме так, а если накинуть на график. Скажем так на демо, то вижу другую ошибку:
PHP:
00:16:03 BaseTemplate EURUSD,M1: Logging => CreatWorkingSMBArray() => Ошибка № 0 :: Ошибка при работе с объектом
С каким объектом там не удаётся работать ума не приложу Ведь количество то инструментов получается верно! Да и в тестере тоже самое..
 

Вложения

  • MakeListOfInstruments.mqh
    15,2 КБ · Просмотры: 14
Последнее редактирование модератором:

Vik940

Почетный гражданин
Уважаемые форумчане помогите найти индикатор в подвале с открытым кодом, нужен для вставки в сов.но надо закрепить мин и макс (0 и 100) или может кто подскажет как в советнике это сделать прописать
Код:
double Indi3=iCustom(Symbol(),0,"2",0,1);
double Indi4=iCustom(Symbol(),0,"2",1,1);
if(Indi3<= 45)Sig=1; //  - открываемся в бай
if(Indi4 >=55)Sig=2; //  - открываемся в селл
 

Вложения

  • 2.ex4
    11,9 КБ · Просмотры: 20
  • EURUSDH1.png
    EURUSDH1.png
    25,8 КБ · Просмотры: 50

Ugar

Гуру форума
Уважаемые форумчане помогите найти индикатор в подвале с открытым кодом, нужен для вставки в сов.но надо закрепить мин и макс (0 и 100) или может кто подскажет как в советнике это сделать прописать
Код:
double Indi3=iCustom(Symbol(),0,"2",0,1);
double Indi4=iCustom(Symbol(),0,"2",1,1);
if(Indi3<= 45)Sig=1; //  - открываемся в бай
if(Indi4 >=55)Sig=2; //  - открываемся в селл
Ну так приведён же код. Нет никаких подвалов и закрепление уровней при вызове из советника. Это относится только к отображению. В советнике получается значение буферов на барах.
Только вот у этого индикатора 3 буфера, а не 2.
Нужно сначала определиться что должен показывать индикатор для сигналов.
 

Vik940

Почетный гражданин
Ну так приведён же код. Нет никаких подвалов и закрепление уровней при вызове из советника. Это относится только к отображению. В советнике получается значение буферов на барах.
Только вот у этого индикатора 3 буфера, а не 2.
Нужно сначала определиться что должен показывать индикатор для сигналов.
Спасибо, понял переправил теперь открывает строго по сигналу
Код:
double Indi3=iCustom(Symbol(),0,"2",1,1);
double Indi4=iCustom(Symbol(),0,"2",2,1);
if(Indi3!=EMPTY_VALUE)Sig=1; //  - открываемся в бай
if(Indi4!=EMPTY_VALUE)Sig=2; //  - открываемся в селл
но появился еще вопрос как прописать чтобы позиции в Buy открывались только когда точка входа расположена ниже скажем 30, а в Sell выше 70.
 

Ugar

Гуру форума
Спасибо, понял переправил теперь открывает строго по сигналу
Код:
double Indi3=iCustom(Symbol(),0,"2",1,1);
double Indi4=iCustom(Symbol(),0,"2",2,1);
if(Indi3!=EMPTY_VALUE)Sig=1; //  - открываемся в бай
if(Indi4!=EMPTY_VALUE)Sig=2; //  - открываемся в селл
но появился еще вопрос как прописать чтобы позиции в Buy открывались только когда точка входа расположена ниже скажем 30, а в Sell выше 70.
Если под точкой входа имеется ввиду 1 и 2 буферы, то будет
if(Indi3!=EMPTY_VALUE && Indi3<30)Sig=1; // - открываемся в бай
if(Indi4!=EMPTY_VALUE && Indi4>70)Sig=2; // - открываемся в селл
 

tommy27

Гуру форума
Функция WebRequest

Кто нибудь уже пользовался функцией WebRequest ?
MQL4: Добавлена функция WebRequest для работы с HTTP-запросами, благодаря которой MQL4-программы теперь могут взаимодействовать с различными сайтами и веб-службами.

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

Функция WebRequest() получает и отправляет информацию с веб-сайтов с помощью GET и POST-запросов. Чтобы разрешить MQL4-программе осуществлять такие запросы, необходимо включить опцию "Разрешить WebRequest для следующих URL" в настройках терминала и явным образом вручную прописать URL-адреса доверенных сайтов.

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