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

hoz

Активный участник
Хм. Кто может объяснить эту ситуацию? Вот скрин:

0_942c6_1cda87ad_orig.jpg

Вод кусок кода:

PHP:
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на указанном баре                                             |
//+-------------------------------------------------------------------------------------+
double GetMA(int index, int maPeriod, int mode)
{
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, mode, index));
}
//+-------------------------------------------------------------------------------------+
//| Имеет ли место отскок?                                                              |
//+-------------------------------------------------------------------------------------+
void IsRebound(int crossDir[], bool& returnSign[])
{
   int up,
       down;
   for (int i = 0; i < 4; i++)
   {
      returnSign[i] = false;
      
      if (crossDir[i] == CROSS_NO)
         continue;

//      double ema = GetMA(1, g_maPeriod[i]);

      if (crossDir[i] == CROSS_UP)
      {
         double ema = GetMA(0, g_maPeriod[i], MODE_LOW);
         if (ND(Ask - ema) <= i_thresholdFromMa * pt) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
         {
            returnSign[i] = true;
            VrPrReturnSign (" returnSign["+0+"]"+" = "+ returnSign[0]);
            VrPrReturnSign (" returnSign["+1+"]"+" = "+ returnSign[1]);
            VrPrReturnSign (" returnSign["+2+"]"+" = "+ returnSign[2]);
            VrPrReturnSign (" returnSign["+3+"]"+" = "+ returnSign[3]);
            Print(" ND(Ask - ema) <= i_thresholdFromMa * pt; ", ND(Ask - ema), " <= ", i_thresholdFromMa * pt);
            Print("Ask = ", Ask);
            Print("ema = ", ema);
         }
      }
      if (crossDir[i] == CROSS_DN)
      {
         ema = GetMA(0, g_maPeriod[i], MODE_HIGH);
         if (ND(ema - Bid) <= i_thresholdFromMa * pt) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
         {
            returnSign[i] = true;
            VrPrReturnSign (" returnSign["+0+"]"+" = "+ returnSign[0]);
            VrPrReturnSign (" returnSign["+1+"]"+" = "+ returnSign[1]);
            VrPrReturnSign (" returnSign["+2+"]"+" = "+ returnSign[2]);
            VrPrReturnSign (" returnSign["+3+"]"+" = "+ returnSign[3]);
            Print(" ND(Ask - ema) <= i_thresholdFromMa * pt; ", ND(ema - Bid), " <= ", i_thresholdFromMa * pt);
            Print("Bid = ", Bid);
            Print("ema = ", ema);
         }
      }
   }
}

Вот принт:

PHP:
2013.04.15 23:28:33	2010.01.11 16:17  Base150_New EURUSD,H1: ema = 1.4522
2013.04.15 23:28:33	2010.01.11 16:17  Base150_New EURUSD,H1: Ask = 1.4509
2013.04.15 23:28:33	2010.01.11 16:17  Base150_New EURUSD,H1:  ND(Ask - ema) <= i_thresholdFromMa * pt; -0.0013 <= 0.0008
2013.04.15 23:28:33	2010.01.11 16:17  Base150_New EURUSD,H1: ema = 1.4522
2013.04.15 23:28:33	2010.01.11 16:17  Base150_New EURUSD,H1: Ask = 1.4509
2013.04.15 23:28:33	2010.01.11 16:17  Base150_New EURUSD,H1:  ND(Ask - ema) <= i_thresholdFromMa * pt; -0.0013 <= 0.0008
2013.04.15 23:28:33	2010.01.11 16:17  Base150_New EURUSD,H1: ema = 1.4522
2013.04.15 23:28:33	2010.01.11 16:17  Base150_New EURUSD,H1: Ask = 1.4509

Там видно, что машка не может быть на цене 1.4522, а по принту типа так и есть. С чем это может быть связано?
 
Последнее редактирование модератором:

AlexeyVik

Программист mql4 mql5
Хм. Кто может объяснить эту ситуацию? Вот скрин:

0_942c6_1cda87ad_orig.jpg

Вод кусок кода:

PHP:
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на указанном баре                                             |
//+-------------------------------------------------------------------------------------+
double GetMA(int index, int maPeriod, int mode)
{
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, mode, index));
}
//+-------------------------------------------------------------------------------------+
//| Имеет ли место отскок?                                                              |
//+-------------------------------------------------------------------------------------+
void IsRebound(int crossDir[], bool& returnSign[])
{
   int up,
       down;
   for (int i = 0; i < 4; i++)
   {
      returnSign[i] = false;
      
      if (crossDir[i] == CROSS_NO)
         continue;

//      double ema = GetMA(1, g_maPeriod[i]);

      if (crossDir[i] == CROSS_UP)
      {
         double ema = GetMA(0, g_maPeriod[i], MODE_LOW);
         if (ND(Ask - ema) <= i_thresholdFromMa * pt) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
         {
            returnSign[i] = true;
            VrPrReturnSign (" returnSign["+0+"]"+" = "+ returnSign[0]);
            VrPrReturnSign (" returnSign["+1+"]"+" = "+ returnSign[1]);
            VrPrReturnSign (" returnSign["+2+"]"+" = "+ returnSign[2]);
            VrPrReturnSign (" returnSign["+3+"]"+" = "+ returnSign[3]);
            Print(" ND(Ask - ema) <= i_thresholdFromMa * pt; ", ND(Ask - ema), " <= ", i_thresholdFromMa * pt);
            Print("Ask = ", Ask);
            Print("ema = ", ema);
         }
      }
      if (crossDir[i] == CROSS_DN)
      {
         ema = GetMA(0, g_maPeriod[i], MODE_HIGH);
         if (ND(ema - Bid) <= i_thresholdFromMa * pt) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
         {
            returnSign[i] = true;
            VrPrReturnSign (" returnSign["+0+"]"+" = "+ returnSign[0]);
            VrPrReturnSign (" returnSign["+1+"]"+" = "+ returnSign[1]);
            VrPrReturnSign (" returnSign["+2+"]"+" = "+ returnSign[2]);
            VrPrReturnSign (" returnSign["+3+"]"+" = "+ returnSign[3]);
            Print(" ND(Ask - ema) <= i_thresholdFromMa * pt; ", ND(ema - Bid), " <= ", i_thresholdFromMa * pt);
            Print("Bid = ", Bid);
            Print("ema = ", ema);
         }
      }
   }
}

Вот принт:

PHP:
2013.04.15 23:28:33    2010.01.11 16:17  Base150_New EURUSD,H1: ema = 1.4522
2013.04.15 23:28:33    2010.01.11 16:17  Base150_New EURUSD,H1: Ask = 1.4509
2013.04.15 23:28:33    2010.01.11 16:17  Base150_New EURUSD,H1:  ND(Ask - ema) <= i_thresholdFromMa * pt; -0.0013 <= 0.0008
2013.04.15 23:28:33    2010.01.11 16:17  Base150_New EURUSD,H1: ema = 1.4522
2013.04.15 23:28:33    2010.01.11 16:17  Base150_New EURUSD,H1: Ask = 1.4509
2013.04.15 23:28:33    2010.01.11 16:17  Base150_New EURUSD,H1:  ND(Ask - ema) <= i_thresholdFromMa * pt; -0.0013 <= 0.0008
2013.04.15 23:28:33    2010.01.11 16:17  Base150_New EURUSD,H1: ema = 1.4522
2013.04.15 23:28:33    2010.01.11 16:17  Base150_New EURUSD,H1: Ask = 1.4509
Там видно, что машка не может быть на цене 1.4522, а по принту типа так и есть. С чем это может быть связано?
А ты проверь какие МА поставлены на график. Совпадает-ли с параметрами в советнике.
 
Последнее редактирование модератором:

cfifcfif

Элитный участник
Приветствую ребят памогите с проблемкой вот сов у меня торгует как на 5 так и на 4 знаках решил его обробывать на счёте NDD не открывает ордера пишет не хватает маржи хотя ручками открываю с таким же обьёмам всё нормально. может в коде что изменить подскажите.
 

hoz

Активный участник
Приветствую ребят памогите с проблемкой вот сов у меня торгует как на 5 так и на 4 знаках решил его обробывать на счёте NDD не открывает ордера пишет не хватает маржи хотя ручками открываю с таким же обьёмам всё нормально. может в коде что изменить подскажите.

Ну капай в функциях, где происходит рассчёт лота или проверка средств. Что-то с этим связано.
 

cfifcfif

Элитный участник
Дак уже всё перепробывал не 1 год вродебы первый раз такое встричаю такое впечатление что мультивалютная торговля заприщена ну это тоже бред.
 

hoz

Активный участник
Кто писал её, сам? Или это декомпил? Посмотреть можно на досуге, конечно, если оно того стоит. Хотя это не логично. Маржа и количество знаков после запятой.. это вещи разные. Даже интересно, как это так!
 

Игoрь

Новичок форума
вопрос такой: как в коде написать условие откытия но не по самому индикатору (допустим CCI) а по машке , наложенной на сам индикатор?
 

Ugar

Гуру форума
вопрос такой: как в коде написать условие откытия но не по самому индикатору (допустим CCI) а по машке , наложенной на сам индикатор?
В цикле вызвать CCI на разных барах и записать значение в массив. Количество ячеек массива = количеству вызова CCI и больше периода усреднения МА. В результате есть массив с значениями CCI.
По массиву можно построить МА, функция iMAOnArray(). Синтаксис в справочнике.
Таким способом можно натянуть МА на индикаторы, даже на те, на которые не удаётся натянуть вручную.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Приветствую ребят памогите с проблемкой вот сов у меня торгует как на 5 так и на 4 знаках решил его обробывать на счёте NDD не открывает ордера пишет не хватает маржи хотя ручками открываю с таким же обьёмам всё нормально. может в коде что изменить подскажите.
Каждую неделю обсуждают вопрос постановки стопов на счетах NDD и ECN
Может ты не слышал ни разу и пытаешься открыть ордер со стопами?
 

tommy27

Гуру форума
Всем привет, есть вопрос: в сове открытие поз должно стартовать при поступлении 2-х сигналов, каждый сигнал длится в течении одного бара, сигналы могут поступить как на одном баре так и на разных, как сделать так чтоб если поступило не 2 сигнала сразу а снвчала один а второй только через несколько баров то сова б запомнила что 1 сигнал уже есть и ждала бы 2-го.
 

qqmber

Почетный гражданин
Всем привет, есть вопрос: в сове открытие поз должно стартовать при поступлении 2-х сигналов, каждый сигнал длится в течении одного бара, сигналы могут поступить как на одном баре так и на разных, как сделать так чтоб если поступило не 2 сигнала сразу а снвчала один а второй только через несколько баров то сова б запомнила что 1 сигнал уже есть и ждала бы 2-го.

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

tommy27

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

Каждому своё, меня интересует только то о чём я спросил
проверять каждый раз, нет ли комбинации из двух сигналов
с этим проблем нет.
 

Ugar

Гуру форума
Всем привет, есть вопрос: в сове открытие поз должно стартовать при поступлении 2-х сигналов, каждый сигнал длится в течении одного бара, сигналы могут поступить как на одном баре так и на разных, как сделать так чтоб если поступило не 2 сигнала сразу а снвчала один а второй только через несколько баров то сова б запомнила что 1 сигнал уже есть и ждала бы 2-го.
1. Хранить сигналы в статических переменных. Наиболее простой способ, но у него есть недостаток. Если 1 сигнал был тогда когда советник не работал (не было связи, не запущен терминал...) то второй сигнал не сработает так как первый не был записан в статическую переменную.
2. При получении сигнала поискать в истории предыдущий. Для этого есть операторы циклов. Сложнее, но надёжнее.
 

qqmber

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

tommy27

Гуру форума
С глобальными чёт не клеитса то не запишется то не вызовется, а через статистические пробовал делать но тож чет в тупик зашел всегда 0 возвращает почему не понял
PHP:
int SIGNAL()
  {
   static int CurrentSignal ;
   static int LastSignal ;
   if(sign1()==1)  CurrentSignal = 1; 
   if(sign1()==2)  CurrentSignal = 2; 
   if(sign1()==0&&LastSignal==1)CurrentSignal = 1;
   if(sign1()==0&&LastSignal==2)CurrentSignal = 2;
   if(LastSignal != CurrentSignal) LastSignal = CurrentSignal;
      return(LastSignal);
   }

попробую через циклы мож получится
 
Последнее редактирование:
Верх