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

AlexeyVik

Программист mql4 mql5
Блин, ну я не знаю уже! Очень зол.
Мой эксперт не хочет открывать лоты на покупку. На продажу - сколько угодно. А на покупку -балалайка! Прошу показать, может у меня глаз кривой. Вот часть кода про продажу и про покупку:

void OnTick()
{
PriceHigh = NormalizeDouble(iCustom(Symbol(), PERIOD_CURRENT,"X_C_O_D_E", SignalPeriod, Deviat, 1, 2),Digits);
PriceLow = NormalizeDouble(iCustom(Symbol(), PERIOD_CURRENT,"X_C_O_D_E", SignalPeriod, Deviat, 0, 2),Digits);
Comment("верх"+DoubleToString(PriceHigh, Digits())+"\n"+ "низ"+DoubleToString(PriceLow, Digits()));
//+--- Выставляем ордер на покупку
if (OrdersTotal()<=0)
{
if(Open[2]<PriceHigh && Close[1]>PriceHigh) //Если ордеров на покупку нет, открытие бара ниже, а закрытие выше или равно, и прошло тиков не более 4, то...
ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, PriceLow, NormalizeDouble(Ask+TakeProfit*Point, Digits), "TMA", Magic, 0, Green); // Открываем сделку на покупку
Alert (GetLastError());
}
//+---Задаем цикл для расчета количества активных ордеров на продажу -------------------+

if (CountSell()<=0)
{
if(Open[1]>=PriceLow && Close[1]<PriceLow && Volume[0]<2) //Если открытие бара выше, а закрытие ниже ил равно, и прошло тиков не более 4, то...
ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, PriceHigh, NormalizeDouble(Bid-TakeProfit*Point, Digits), "TMA", Magic, 0, Red); // Открываем сделку на продажу
}

Ну и далее по тексту. Вначале идет оператор своего индюка и он берет данные корректно - это подтверждено комментами и в продажном лоте потом СтопЛосс на это ориентируется. А вот покупной скрипт не фигачит. Вообще не ставит лоты. И алерта ошибки нету. Хрень какая-то...
Сначала проверь тут
 

Вложения

  • 00.png
    00.png
    26 КБ · Просмотры: 39

_SERG_

Активный участник
Блин, ну я не знаю уже! Очень зол.
Мой эксперт не хочет открывать лоты на покупку. На продажу - сколько угодно. А на покупку -балалайка! Прошу показать, может у меня глаз кривой. Вот часть кода про продажу и про покупку:

void OnTick()
{
PriceHigh = NormalizeDouble(iCustom(Symbol(), PERIOD_CURRENT,"X_C_O_D_E", SignalPeriod, Deviat, 1, 2),Digits);
PriceLow = NormalizeDouble(iCustom(Symbol(), PERIOD_CURRENT,"X_C_O_D_E", SignalPeriod, Deviat, 0, 2),Digits);
Comment("верх"+DoubleToString(PriceHigh, Digits())+"\n"+ "низ"+DoubleToString(PriceLow, Digits()));
//+--- Выставляем ордер на покупку
if (OrdersTotal()<=0)
{
if(Open[2]<PriceHigh && Close[1]>PriceHigh) //Если ордеров на покупку нет, открытие бара ниже, а закрытие выше или равно, и прошло тиков не более 4, то...
ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, PriceLow, NormalizeDouble(Ask+TakeProfit*Point, Digits), "TMA", Magic, 0, Green); // Открываем сделку на покупку
Alert (GetLastError());
}
//+---Задаем цикл для расчета количества активных ордеров на продажу -------------------+

if (CountSell()<=0)
{
if(Open[1]>=PriceLow && Close[1]<PriceLow && Volume[0]<2) //Если открытие бара выше, а закрытие ниже ил равно, и прошло тиков не более 4, то...
ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, PriceHigh, NormalizeDouble(Bid-TakeProfit*Point, Digits), "TMA", Magic, 0, Red); // Открываем сделку на продажу
}

Ну и далее по тексту. Вначале идет оператор своего индюка и он берет данные корректно - это подтверждено комментами и в продажном лоте потом СтопЛосс на это ориентируется. А вот покупной скрипт не фигачит. Вообще не ставит лоты. И алерта ошибки нету. Хрень какая-то...


Я тут не вникал в подробности твоей логики, но думаю идею ты поймёшь:
Код:
//+------------------------------------------------------------------+
void OnTick(){
  PriceHigh = NormalizeDouble(iCustom(Symbol(), PERIOD_CURRENT, "X_C_O_D_E", SignalPeriod, Deviat, 1, 2),Digits);
  PriceLow  = NormalizeDouble(iCustom(Symbol(), PERIOD_CURRENT, "X_C_O_D_E", SignalPeriod, Deviat, 0, 2),Digits);
  Comment("верх"+DoubleToString(PriceHigh, Digits())+"\n"+ "низ"+DoubleToString(PriceLow, Digits()));
  //+--- Выставляем ордер на покупку
  if ( OrdersTotal() [COLOR=Red]==[/COLOR] 0 ){  //[COLOR=Red]  Эт типа если нет рыночных и отложенных ордеров[/COLOR]
    if ( [COLOR=Red]CountBuy() == 0[/COLOR]){ // [Оригинал: [CountBuy() <= 0]] - Эт какое число должно быть, если меньше ноля?
       //Если ордеров на покупку нет, открытие бара ниже, а закрытие выше или равно, и прошло тиков не более 4, то...
       if(Open[2]<PriceHigh && Close[1]>PriceHigh && Volume[0]<2){ 
         // Открываем сделку на покупку
         ticket=OrderSend(Symbol(), 
                          OP_BUY, 
                          Lots, 
                          Ask, 
                          Slippage, 
                          PriceLow, 
                          NormalizeDouble(Ask+TakeProfit*Point, Digits), 
                          "TMA", 
                          Magic, 
                          0, 
                          Green);
        [COLOR=Red] Alert (GetLastError());[/COLOR]
       [COLOR=Red]} // EIF_2[/COLOR]
   [COLOR=Red]} // EIF_1  [/COLOR]
    //+---Задаем цикл для расчета количества активных ордеров на продажу -------------------+
    if ([COLOR=Red] CountSell() == 0[/COLOR]){ // [Оригинал: [CountSell() <= 0]]- Эт какое число должно быть, если меньше ноля?
      if(Open[1]>=PriceLow && Close[1]<PriceLow && Volume[0]<2){     
        // Открываем сделку на продажу
        ticket = OrderSend(Symbol(),
                           OP_SELL, 
                           Lots, 
                           Bid, 
                           Slippage, 
                           PriceHigh, 
                           NormalizeDouble( Bid - TakeProfit * Point, Digits), 
                           "TMA", 
                           Magic, 
                           0, 
                           Red);
       [COLOR=Red]  Alert (GetLastError());                  [/COLOR]
[COLOR=Red]      } // EIF_2
    } // EIF_1  
  } // EIF
} // EOF[/COLOR]
Короче, не аккуратненько!
Сделай аккуратненько, будет очевидненько, и заработает.:laugh:
Скобочки там и другое.

P.S. Валерьянка тебе в помощь. :laugh:
 
Последнее редактирование:

Kayros

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

P.S. Валерьянка тебе в помощь. :laugh:

Благодарю. Щас внимательно с утра еще раз все пересмотрю :)
 

star603

Новичок форума
Ошибка в коде.

Я новичок. Мне нужно чтобы при текущем одном ордере будь то сел будь то бай. Код проверял какой это ордер и открывал противоположный. А дальнейшую его модернизацию я потом придумаю. Не все сразу. Вот этот код:

PHP:
if (OrdersTotal() == 1)
 {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
  {
   if (OrderMagicNumber() == Magic)
   {
    if (OrderType() == OP_BUY)
    {
      //- открываем ордер селл
    }
    if (OrderType() == OP_SELL)
    {
     //- открываем ордер бай
    }
   }
  }
}
 

Rennela

Новичок форума
PHP:
[PHP]
[/PHP]
Я новичок. Мне нужно чтобы при текущем одном ордере будь то сел будь то бай. Код проверял какой это ордер и открывал противоположный. А дальнейшую его модернизацию я потом придумаю. Не все сразу. Вот этот код:

PHP:
if (OrdersTotal() == 1)
 {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
  {
   if (OrderMagicNumber() == Magic)
   {
    if (OrderType() == OP_BUY)
    {
      //- открываем ордер селл
    }
    if (OrderType() == OP_SELL)
    {
     //- открываем ордер бай
    }
   }
  }
}

Я тоже новичек, но я бы написал так:

PHP:
int H=1;
int start()
  {
  for(int i=OrdersTotal();i>=0;i--)
    {
    if(OrderSelect(i,SELECT_BY_POS)==true)
      {
      if(OrderSymbol()!=Symbol())continue;
      if(OrderType()==OP_BUY&&OrderMagicNumber()==Magic)
        {
        while(H==1)
          {
          int t=OrderSend(...
          if(t>0)H=2;
          }
        }
      }  
    }
  return(0);
  }
Наверняка есть способ попроще, но я пока не научился.
 

Rennela

Новичок форума
Или так еще точнее:
PHP:
int H,J,V;
int start()
  {
  RefreshRates();
  for(int i=OrdersTotal();i>=0;i--)
    {
    if(OrderSelect(i,SELECT_BY_POS)==true)
      {
      if(OrderSymbol()!=Symbol())continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderType()==OP_BUY)H=1;
      if(OrderType()==OP_SELL)J=2;
      }  
    }
  V=H+J;
//-------------------------------------------------------------    
  while(V==1)
    {
    int sell=OrderSend(Symbol(),OP_SELL,0.01,Bid,100,0,0);
    if(sell>0)break;
    }
  while(V==2)
    {
    int buy=OrderSend(Symbol(),OP_BUY,0.01,Ask,100,0,0);
    if(buy>0)break;
    }
  V=0;H=0;J=0;      
  return(0);
  }
Это приблизительный макет, там нужно Magic обозначить и другие параметры.
 
Последнее редактирование:

yurez83

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

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

набросайте в общих чертах кому не тяжело логику. спасибки заранее.
 

Ugar

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

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

набросайте в общих чертах кому не тяжело логику. спасибки заранее.
Используй статические переменные для запоминания или переменные объявленные на глобальном уровне. Ну а если нужно что бы значения не были забыты даже при перезапуске терминала, сохраняй их в GV переменные. Если значений много или их количество меняется, то пиши в файл.
static int a;//Статическая перменная

int a;//Переменная объявлена на глобальном уровне
void OnTick()
{

}

GlobalVariableSet(a,0);//GV переменная
 

yurez83

Активный участник
Используй статические переменные для запоминания или переменные объявленные на глобальном уровне
спасибо. я как бы и пытался всё связать в кучу со статическими переменными, но меня "путала" логика сравнения и запоминания уровней.
всё оказалось элементарно. просто нужно было в
int OnInit()
прописать расчёт первичный уровней (на первом тике), а потом в теле:

if ( находится цена между уровнями)
{signal=0;}

else if (выше)
{signal=2;
вычисление уровней}
else if (ниже)
{signal=1;
вычисление уровней}
 

блондинка

Элитный участник
Всем привет!Особенно кто понимает этот язык.)
В индикаторе что прикрепила две EMA(с периодом 2 и 3) и две границы Боллинжера(период 11и 5).
Мне бы русскими словами условие когда рисуются бары(алгоритм),т.е.обратный перевод с языка MQL4)
Очень было бы приятно.Заранее спасибо.
 

Вложения

  • TrendStrength.mq4
    2,8 КБ · Просмотры: 24
  • Screenshot_14.png
    Screenshot_14.png
    57,2 КБ · Просмотры: 47

Ugar

Гуру форума
Всем привет!Особенно кто понимает этот язык.)
В индикаторе что прикрепила две EMA(с периодом 2 и 3) и две границы Боллинжера(период 11и 5).
Мне бы русскими словами условие когда рисуются бары(алгоритм),т.е.обратный перевод с языка MQL4)
Очень было бы приятно.Заранее спасибо.
Если упрощённо:
Если EMA больше верхней границы Боллинжера - зелёные.
Если EMA меньше нижней границы Боллинжера - красные.
 

блондинка

Элитный участник
Если упрощённо:
Если EMA больше верхней границы Боллинжера - зелёные.
Если EMA меньше нижней границы Боллинжера - красные.
Разобралась)))
Если EMA(3) выше верхней границы Боллинжера(11) - зелёные.
Если EMA(3) ниже нижней границы Боллинжера(11) - красные.
Сдвиг 0 отклонение 1.
Тоже для EMA(2) и Боллинжера(5)
Огромное спасибо!
 

Семен12345

Прохожий
Вот подскажите. Бывает, что свеча закончилась, а цены на новой еще нет и брокер не открывает ордер пока не пройдет тик. Это может длиться несколько секунд.
У меня включен советник и мне нужно чтобы он открывал ордер не позднее чем через 5 секунд после начала минуты по серверу брокера, если в течении этих 5 секунд ордер не открыт, то нужно отменить функцию открытия ордера.
Вопрос: Как написать это в коде MQL?
 

Дмитрий 2010

Интересующийся
Доброго времени суток, помогите пожалуйста, пишу советник для ручного тестирования, такая проблема-для быстрой перемотки графика (например 5,5 часа) бросаю на график вертикальную линию с именем (780) когда цена подходит к метке график должен остановиться или замедлиться, я зацыклил Sleep(10000000); но когда наступает момент остановки терминал подвисает на секунду и выключается полностью. Посоветуйте как можно решить эту проблему. Тестер пишу для себя (несколько лет-всё дописую и дописую новые возможности). Буду благодарен за помощь.
 

Ugar

Гуру форума
Вот подскажите. Бывает, что свеча закончилась, а цены на новой еще нет и брокер не открывает ордер пока не пройдет тик. Это может длиться несколько секунд.
У меня включен советник и мне нужно чтобы он открывал ордер не позднее чем через 5 секунд после начала минуты по серверу брокера, если в течении этих 5 секунд ордер не открыт, то нужно отменить функцию открытия ордера.
Вопрос: Как написать это в коде MQL?
В окне "Обзор рынка" вытащить все символы и использовать системный таймер, задать ему щёлкать по секундам. Весь код советника кинуть в OnTimer. Так вряд ли пропустишь нужное время открытия.
Ну а на случай если в нужное время не было тиков не по одному символу, то ещё условие при открытии
if(TimeCurrent()-нужное время открытия <= 5)
Если разница между текущим временем и нужным временем открытия меньше или равно 5 секунд-можно открывать.
 

Ugar

Гуру форума
Доброго времени суток, помогите пожалуйста, пишу советник для ручного тестирования, такая проблема-для быстрой перемотки графика (например 5,5 часа) бросаю на график вертикальную линию с именем (780) когда цена подходит к метке график должен остановиться или замедлиться, я зацыклил Sleep(10000000); но когда наступает момент остановки терминал подвисает на секунду и выключается полностью. Посоветуйте как можно решить эту проблему. Тестер пишу для себя (несколько лет-всё дописую и дописую новые возможности). Буду благодарен за помощь.
При работе в тестере Sleep не вызывает никаких задержек.
 

Семен12345

Прохожий
В окне "Обзор рынка" вытащить все символы и использовать системный таймер, задать ему щёлкать по секундам. Весь код советника кинуть в OnTimer. Так вряд ли пропустишь нужное время открытия.
Ну а на случай если в нужное время не было тиков не по одному символу, то ещё условие при открытии
if(TimeCurrent()-нужное время открытия <= 5)
Если разница между текущим временем и нужным временем открытия меньше или равно 5 секунд-можно открывать.

а если использовать время компьютера?
 

Семен12345

Прохожий
В окне "Обзор рынка" вытащить все символы и использовать системный таймер, задать ему щёлкать по секундам. Весь код советника кинуть в OnTimer. Так вряд ли пропустишь нужное время открытия.
Ну а на случай если в нужное время не было тиков не по одному символу, то ещё условие при открытии
if(TimeCurrent()-нужное время открытия <= 5)
Если разница между текущим временем и нужным временем открытия меньше или равно 5 секунд-можно открывать.

сделал так:
if (m<TimeSeconds(TimeLocal()))
{
if(m>5);
return;
}
работает, но есть предупреждения:

possible use of uninitialized variable 'm'
empty controlled statement found
 

Ugar

Гуру форума
сделал так:
if (m<TimeSeconds(TimeLocal()))
{
if(m>5);
return;
}
работает, но есть предупреждения:

possible use of uninitialized variable 'm'
empty controlled statement found
Мммдааа...
Если время открытия сделки должно быть привязано к первым 5 секундам любой минуты, то это делается так:
if(Seconds()<=5)
{
//здесь открытие сделки
}
Если надо выходить из функции прервав её выполнение
if(Seconds()>5)return;
 
Верх