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

Allis Amazing

Интересующийся
А я сейчас, ну в течение дня проверю и напишу. Спасибки бОльшее!!!
 

hoz

Активный участник
Пытаюсь освоить работу с массивами. Но на практике что-то они не очень поддаются. Расклад простой. Я решил поэкспериментировать, и освоить это дело на простом алгоритме:
- есть основная медленная машка с 365 периодом.
- есть 4 быстрых машки с периодами 6, 25, 150 и 250
В общем, когда быстрая машка пересекает медленную (365-ую) и цена откатывает до быстрой машки, то входим в рынок.
Пишу по тиху код, но что-то не то выходит:

PHP:
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa(int& signal[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   for (int i = 0; i < 4; i++)
   {
      double ema1;
      double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);
      signal[i] = MA_TALKING_FLAT;

      if (ema1 < ema365_1 && ema0 > ema365_0)
         signal[i] = MA_TALKING_LONG;
      if (ema1 > ema365_1 && ema0 < ema365_0)
         signal[i] = MA_TALKING_SHORT;
   }
}
//+-------------------------------------------------------------------------------------+
//| Имеет ли место отскок?                                                              |
//+-------------------------------------------------------------------------------------+
bool IsRebound(int& signal[])
{
   double low = iLow(Symbol(), i_trading_TF, 1);
   double high = iHigh(Symbol(), i_trading_TF, 1);
   // Получаем 2 соседних значения ema6
   for(int i=0; i<4; i++)
   {
     double ema1;
     double ema0 = GetCurAndPrevMA(g_maPeriod[i],ema1);
   
     RefreshRates();

     if (GetStateMa(signal[i]) == MA_TALKING_LONG)
     {
       if (ema1 < low)
          if (ema0 >= Bid)
             return (true);
     }
     if (GetStateMa(signal[i]) == MA_TALKING_SHORT)
     {
       if (ema1 > high)
          if (ema0 <= Ask)
             return (true);
     }
   }
 
   return (false);
}
//+-------------------------------------------------------------------------------------+
//| Получение общего сигнала на вход                                                    |
//+-------------------------------------------------------------------------------------+
void GetGeneralSignal(int& signal[])
{
  for(int i=0; i<4; i++)
  {
    signal[i] = SIGNAL_NO;
    
    if(GetStateMa(signal[i]) == MA_TALKING_LONG && IsRebound(signal[i]) == true)
      signal[i] = SIGNAL_BUY;
    
    if(GetStateMa(signal[i]) == MA_TALKING_SHORT && IsRebound(signal[i]) == true)
      signal[i] = SIGNAL_SELL;
  }
}
В start имеем это:

PHP:
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   static datetime barTime = 0;
   if (barTime == iTime(NULL, i_trading_TF, 0))
      return (0);

   int signal[4];
   GetStateMa(signal);
  
   GetGeneralSignal(signal);

   if (!Trade(signal))
      return (0);

   barTime = iTime(NULL, i_trading_TF, 0);
   return (0);
}
Суть такая, при компиляции компилятор ругается так:

Код:
'signal' - incompatible types    E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (126, 21)
'signal' - incompatible types    E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (132, 21)
'signal' - incompatible types    E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (151, 19)
'signal' - incompatible types    E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (151, 62)
'signal' - incompatible types    E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (154, 19)
'signal' - incompatible types    E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (154, 63)
Почему так?

Ругается он наразличные места. Например, в функции bool IsRebound(int& signal[]) строчки:

PHP:
if (GetStateMa(signal[i]) == MA_TALKING_LONG)
if (GetStateMa(signal[i]) == MA_TALKING_SHORT)
Как тут может быть ошибка не понимаю, ведь я задал цикл и по индексу должно перебираться?
 
Последнее редактирование модератором:

hoz

Активный участник
На дёмке пока пашет, но и ситуации не было подходящей, а тестер аж завис от ошибок, файл скомпилировался нормально...

Если ты не знаешь алгоритм своей совы, то почему ты так в него упёрлась? Я, например, недоверяю левым разработкам, если не в курсе про алгоритм той или иной совы..
 

ale002

::: __,,,^._.^,,,__ :::
Код:
bool CheckTimeFors()
{
[COLOR="Red"]return(false);[/COLOR]
Благодарствую что не оставили без внимания! Вот в сюда?
[/QUOTE]
Уес. Но вам правильно пишут, что надо функцию построчно разобрать, может кроме проверки условия она делает что-то ещё - меняет какие-то значения в глобальных переменных, а они влияют на работу др функций

[QUOTE="hoz, post: 560128, member: 46136"]
[PHP]if (GetStateMa(signal[i]) ...

void GetStateMa(int& signal[])
[/PHP][/QUOTE]

В if функции передается единственное значение массива нумер i, т.е. переменная а не массив, как требует GetStateMa(int& signal[])
 

hoz

Активный участник
В if функции передается единственное значение массива нумер i, т.е. переменная а не массив, как требует GetStateMa(int& signal[])

Так у меня ж там цикл:

PHP:
for(int i=0; i<4; i++)


Для каждого i идёт проверка условия, то для каждого индекса (для каждой машки)

Поэтому я и сравниваю по каждому индексу отдельно, как же иначе?
 

Allis Amazing

Интересующийся
Если ты не знаешь алгоритм своей совы, то почему ты так в него упёрлась? Я, например, недоверяю левым разработкам, если не в курсе про алгоритм той или иной совы..

Её писали мне, с моих слов, но программист был суперответственным человеком, и он чутка перестарался с подстраховкой. Эта функция что он придумал, она очень хорошая, но вот я не могла долго начать тестирование, и не знала об одном этом её недостатке. А теперь и связь с программистом потеряна и хочется что бы сова работала... :cr:
 

Allis Amazing

Интересующийся
И всё-таки поменяв все 12 на -1 и 48 на 60 Сова все равно посчитала что время пришло и сменила СЛ у открытых ордеров..... Я близка к помешательству.... Значит даже если время настать не может(!) всё равно алгоритм силён и делает свою работу)))
Программист был настолько силён, что видимо учёл и форс-мажор для форс-мажора....
 

Ugar

Гуру форума
И всё-таки поменяв все 12 на -1 и 48 на 60 Сова все равно посчитала что время пришло и сменила СЛ у открытых ордеров..... Я близка к помешательству.... Значит даже если время настать не может(!) всё равно алгоритм силён и делает свою работу)))
Программист был настолько силён, что видимо учёл и форс-мажор для форс-мажора....
Наверняка там всё просто. Но смена какого то условия не всегда приводит к правильным результатам. Есть 3 варианта действий.
1. разыскать программиста, писавшего советник. Хороший вариант, но не всегда выполнимый.
2. Обратиться к другому программисту. Предоставить ему код целиком. Объяснить что нужно переделать. Не лучший вариант, но может быть самым оптимальным.
3. Выучить основы языка программирования и разобраться в коде самостоятельно. учебники и справочники есть в свободном доступе. Лучший вариант. Эти навыки лишними не будут.
 

hoz

Активный участник
Так у меня ж там цикл:

PHP:
for(int i=0; i<4; i++)


Для каждого i идёт проверка условия, то для каждого индекса (для каждой машки)

Поэтому я и сравниваю по каждому индексу отдельно, как же иначе?


Неужели такой сложный вопрос, что никто не знает ответ? Здесь идёт обсуждение кода, который полностью никто не видит, и даже, нет канкретной картины его алгоритма.
Я же описал задачу явно, и это вроде как можно понять, если, конечно, кто-то понимает как это делается.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Неужели такой сложный вопрос, что никто не знает ответ? Здесь идёт обсуждение кода, который полностью никто не видит, и даже, нет канкретной картины его алгоритма.
Я же описал задачу явно, и это вроде как можно понять, если, конечно, кто-то понимает как это делается.
hoz, ты сказал, что изучаешь массивы, а массивы не объявлены. Какое-же может быть изучение если ты даже не прочёл о том как массивы объявляются...
 

hoz

Активный участник
hoz, ты сказал, что изучаешь массивы, а массивы не объявлены. Какое-же может быть изучение если ты даже не прочёл о том как массивы объявляются...


Как это не прочёл. У меня на глобальном объявлено так:

PHP:
int g_maPeriod[4] = {6, 25, 150, 250},             // Периоды обрабатываемых МА
    g_signMA[4] = {1, 2, 3, 4};                    // Признаки МАшек, добавляемые в Magic
                                                   // ..Number ордера к основному Magic
int signal[4] = {1,2,3,4};
 

ale002

::: __,,,^._.^,,,__ :::
Неужели такой сложный вопрос, что никто не знает ответ? Здесь идёт обсуждение кода, который полностью никто не видит, и даже, нет канкретной картины его алгоритма.
Я же описал задачу явно, и это вроде как можно понять, если, конечно, кто-то понимает как это делается.

Отжеж божеш мой, вам жеж и терминал в журнале пишет и здесь уже написали - сделайте одиноковый тип переменной в вызове функции и в описании ее переменных. Уберите квадратные скобки в GetStateMa(int& signal[]) и жизень станет проще :)
 

hoz

Активный участник
Отжеж божеш мой, вам жеж и терминал в журнале пишет и здесь уже написали - сделайте одиноковый тип переменной в вызове функции и в описании ее переменных. Уберите квадратные скобки в GetStateMa(int& signal[]) и жизень станет проще :)

Я вижу, что проблема в том, что тип функции GetStateMa(int& signal[])
void т.е. она ничего не возвращает. Тока у меня в функции:

PHP:
void GetGeneralSignal(int& signal[])
{
  for(int i=0; i<4; i++)
  {
    signal[i] = SIGNAL_NO;
    
    if(GetStateMa(signal[i]) == MA_TALKING_LONG && IsRebound(signal[i]) == true)
      signal[i] = SIGNAL_BUY;
    
    if(GetStateMa(signal[i]) == MA_TALKING_SHORT && IsRebound(signal[i]) == true)
      signal[i] = SIGNAL_SELL;
  }
}


уже в буфер кладутся значения сигнала. А по скольку функция GetStateMa(int& signal[]) ничего не возвращает, то для того чтоб хранить значения направления машек нужен ещё один массив так? И тогда мне нужно будет есс-но сравнивать массив с дефайном..
 

Allis Amazing

Интересующийся
Наверняка там всё просто. Но смена какого то условия не всегда приводит к правильным результатам. Есть 3 варианта действий.
1. разыскать программиста, писавшего советник. Хороший вариант, но не всегда выполнимый.
2. Обратиться к другому программисту. Предоставить ему код целиком. Объяснить что нужно переделать. Не лучший вариант, но может быть самым оптимальным.
3. Выучить основы языка программирования и разобраться в коде самостоятельно. учебники и справочники есть в свободном доступе. Лучший вариант. Эти навыки лишними не будут.

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

hoz

Активный участник
По сути я ещё один массив объявил. Получилось уже всё, можно, казать нормально. Но в одном месте та же ругань.

Вот места, нужные для понимания происходящего:

Объявлено глобально:

PHP:
int g_maPeriod[4] = {6, 25, 150, 250},             // Периоды обрабатываемых МА
    g_signMA[4] = {1, 2, 3, 4};                    // Признаки МАшек, добавляемые в Magic
                                                   // ..Number ордера к основному Magic
int signal[4] = {1,2,3,4};                         // Сигналы на вход в рынок
int stateMA[4] = {1,2,3,4};                          // Положение машек относительно друг друга


#define MA_TALKING_LONG                         0                             // Машки расположены к покупке
#define MA_TALKING_SHORT                        1                             // Машки расположены к продаже
#define MA_TALKING_FLAT                        -1                             // Машки указывают на флет
#define SIGNAL_BUY                              0                             // Сигнал на покупку
#define SIGNAL_SELL                             1                             // Сигнал на продажу
#define SIGNAL_NO                              -1                             // Сигнала нет
Функции связаны с данными массивами вот:

PHP:
//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                  |
//+-------------------------------------------------------------------------------------+
int FindOrders(int sign)
{
   int t;                                                 // Количество открытых позиции (buy's + sell's)

   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) 
         continue;
         
      if (OrderMagicNumber() == i_myMagic + sign &&
          OrderSymbol() == Symbol())
        t++;
   }

   return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa(int& stateMA[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   for (int i = 0; i < 4; i++)
   {
      double ema1;
      double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);
      stateMA[i] = MA_TALKING_FLAT;

      if (ema1 < ema365_1 && ema0 > ema365_0)
         stateMA[i] = MA_TALKING_LONG;
      if (ema1 > ema365_1 && ema0 < ema365_0)
         stateMA[i] = MA_TALKING_SHORT;
   }
}
//+-------------------------------------------------------------------------------------+
//| Имеет ли место отскок?                                                              |
//+-------------------------------------------------------------------------------------+
bool IsRebound(int& stateMA[])
{
   double low = iLow(Symbol(), i_trading_TF, 1);
   double high = iHigh(Symbol(), i_trading_TF, 1);
   // Получаем 2 соседних значения ema6
   for(int i=0; i<4; i++)
   {
     double ema1;
     double ema0 = GetCurAndPrevMA(g_maPeriod[i],ema1);
   
     RefreshRates();

     if (stateMA[i] == MA_TALKING_LONG)
     {
       if (ema1 < low)
          if (ema0 >= Bid)
       return (true);
     }
     if (stateMA[i] == MA_TALKING_SHORT)
     {
       if (ema1 > high)
          if (ema0 <= Ask)
       return (true);
     }
   }
 
   return (false);
}
//+-------------------------------------------------------------------------------------+
//| Получение общего сигнала на вход                                                    |
//+-------------------------------------------------------------------------------------+
void GetGeneralSignal(int& signal[])
{
  for(int i=0; i<4; i++)
  {
    signal[i] = SIGNAL_NO;
    
    if(stateMA[i] == MA_TALKING_LONG && IsRebound(stateMA[i]) == true)
      signal[i] = SIGNAL_BUY;
    
    if(stateMA[i] == MA_TALKING_SHORT && IsRebound(stateMA[i]) == true)
      signal[i] = SIGNAL_SELL;
  }
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинных позиций                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(int i_myMagic)
{
  int ticket = -1;
  string myNote = "Сов баянул";
  
  ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,i_slippage,0,0,myNote,i_myMagic,0,Blue);
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие коротких позиций                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(int i_myMagic)
{
  int ticket = -1;
  string myNote = "Сов шортанул";

  ticket = OrderSend(Symbol(),OP_SELL,0.1,Bid,i_slippage,0,0,myNote,i_myMagic,0,Red);
 
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int& signal[])
{
   for (int i = 0; i < 4; i++)
   {   
      if (stateMA[i] == MA_TALKING_LONG && FindOrders(g_signMA[i]) == 0)
         if (!OpenBuy(g_signMA[i]))
            return (false);

      if (stateMA[i] == MA_TALKING_LONG && FindOrders(g_signMA[i]) == 0)
         if (!OpenSell(g_signMA[i]))
            return (false);
   }
 
   return (true);
}
В start вот это:

PHP:
int start()
{
   static datetime barTime = 0;
   if (barTime == iTime(NULL, i_trading_TF, 0))
      return (0);

   int signal[4];
   int stateMA[4];
   
   GetStateMa(signal);
  
   GetGeneralSignal(signal);

   if (!Trade(signal))
      return (0);

   barTime = iTime(NULL, i_trading_TF, 0);
   return (0);
}
При компиляции ошибка:


Код:
'stateMA' - incompatible types    E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (152, 51)
'stateMA' - incompatible types    E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (155, 52)
2 ошибок, 0 предупреждений
Ошибка указывает на функцию void GetGeneralSignal(int& signal[])
В выражениях IsRebound(stateMA) == true на stateMA ругань. Тип int Вроде как нет никаких различий. Что тут не так?

И вообще просьба посоветовать по коду, может что не так пишу.. что касается стиля...
 
Последнее редактирование модератором:

Ugar

Гуру форума
1-ый пункт невыполним, я бы и не мучилась даже.
2-ой не вариант, пробовала, но говорят слишком сложный алгоритм.
3-ий вот этим аккурат я сейчас и занялась, только где бы найти "доступную" азбуку, там где бы было не просто написано что бывают глобальные, а бывают переменные, а ещё и их функции на доступном языке....
На сайте авторов есть официальный букварь. _http://book.mql4.com/ru/
А вообще их много написано.
 

Allis Amazing

Интересующийся
На сайте авторов есть официальный букварь. _http://book.mql4.com/ru/
А вообще их много написано.

Ай, спасибо, посмотрю. Просто человек который знает тему, всегда может отличить "толковый букварь" от "ну что-то там на эту тему написано")))
 

hoz

Активный участник
Ай, спасибо, посмотрю. Просто человек который знает тему, всегда может отличить "толковый букварь" от "ну что-то там на эту тему написано")))


На самом деле учебником "это" не назовёшь. Сделано абы-как... Лучше смотри чьи-н. коды и изучай как они написано, а потом когда будет понимать как работаю эксперты, сможешь сама писать. А "то" что на оф. сайте.. используй как документацию и не более того. Документация с большего сносная, а учебника по сути нет, одно название..
 

Allis Amazing

Интересующийся
На самом деле учебником "это" не назовёшь. Сделано абы-как... Лучше смотри чьи-н. коды и изучай как они написано, а потом когда будет понимать как работаю эксперты, сможешь сама писать. А "то" что на оф. сайте.. используй как документацию и не более того. Документация с большего сносная, а учебника по сути нет, одно название..
Улыбнули, я с утра посмотрев на этот "учебник" уже поняла, что надо взять что-то простенькое и начать его курочить, а в "учебник" аккурат подглядывать за разъяснениями)))
_http://mql4you.ru/mql-school/metaeditor-urok-1.html
Вот нашла, вдруг кому-то поможет.
 
Последнее редактирование модератором:
Верх