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

Milord

Местный знаток
Всем привет, возник вопрос?
давно не был на форуме, язык малость подзабыл, тем более в новых билдах много изменений, вопрос в следующем:
- нужен кусок кода,который бы заставлял открывать ордера , так чтобы на каждом новом баре открывалось не более 1 ордера, а условие открытия ордера например по пересечению цены и МА, прошу уважаемых проггеров добавить в этот код нужные строки:
Код:
int start()
{
double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
if(Bid > ma)
   {
      OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+StopLoss*Point, Ask-TakeProfit*Point, NULL, MagicNumber, 0, Red);
   }

return(0);
}
 

MakarFX

Элитный участник
нужен кусок кода
C-подобный:
datetime newbar;
int start()
  {
   double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
   if(newbar!=Time[0]&&Bid > ma)
     {
      if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+StopLoss*Point, Ask-TakeProfit*Point, NULL, MagicNumber, 0, Red))
      newbar=Time[0];
     }

   return(0);
  }
 

Milord

Местный знаток
C-подобный:
datetime newbar;
int start()
  {
   double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
   if(newbar!=Time[0]&&Bid > ma)
     {
      if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+StopLoss*Point, Ask-TakeProfit*Point, NULL, MagicNumber, 0, Red))
      newbar=Time[0];
     }

   return(0);
  }
спасибо за ответ, и еще вопрос , если для ордеров бай, тоже добавить открытие на каждом баре не более 1 ордера, то общий код вот так правильно писать?
Код:
double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
   if(newbar!=Time[0]&&Bid > ma)
     {
      if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+SL*Point, Ask-TP*Point, NULL, MagicNumber, 0, Red))
      newbar=Time[0];
     }

   if(newbar!=Time[0]&&Ask < ma)
     {
      if(OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-SL*Point, Bid+TP*Point, NULL, MagicNumber, 0, Red))
      newbar=Time[0];
     }
 
Последнее редактирование:

MakarFX

Элитный участник
спасибо за ответ, и еще вопрос , если для ордеров бай, тоже добавить открытие на каждом баре не более 1 ордера
Если Вы хотите только один ордер и только в одном направлении, то
C-подобный:
datetime newbar;
double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
if(newbar!=Time[0])
  {
   if(Bid > ma)
     {
      if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+SL*Point, Ask-TP*Point, NULL, MagicNumber, 0, Red))
         newbar=Time[0];
     }
   if(Ask < ma)
     {
      if(OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-SL*Point, Bid+TP*Point, NULL, MagicNumber, 0, Red))
         newbar=Time[0];
     }
  }

Если Вы хотите по одному в каждом направлении, то
C-подобный:
datetime b_newbar,s_newbar;
double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
if(s_newbar!=Time[0]&&Bid > ma)
  {
   if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+SL*Point, Ask-TP*Point, NULL, MagicNumber, 0, Red))
      s_newbar=Time[0];
  }
if(b_newbar!=Time[0]&&Ask < ma)
  {
   if(OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-SL*Point, Bid+TP*Point, NULL, MagicNumber, 0, Red))
      b_newbar=Time[0];
  }
 

vladradon

Программист
Всем привет, возник вопрос?
давно не был на форуме, язык малость подзабыл, тем более в новых билдах много изменений, вопрос в следующем:
- нужен кусок кода,который бы заставлял открывать ордера , так чтобы на каждом новом баре открывалось не более 1 ордера, а условие открытия ордера например по пересечению цены и МА, прошу уважаемых проггеров добавить в этот код нужные строки:
Код:
int start()
{
double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
if(Bid > ma)
   {
      OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+StopLoss*Point, Ask-TakeProfit*Point, NULL, MagicNumber, 0, Red);
   }

return(0);
}
Привет. В коде не обозначено пересечение - только положение цены относительно машки.;) Чтобы обозначить именно пересечение, нужно сравнивать 2 соседних бара или запоминать предыдущее состояние цены относительно машки и сравнивать с текущим с последующим обновлением предыдущего состояния - триггер.
А сейчас будет открытие на каждом баре либо в бай, либо в селл, если цена не будет точно равна значению машки или машка не будет между Ask и Bid.
 

Milord

Местный знаток
Если Вы хотите только один ордер и только в одном направлении, то
C-подобный:
datetime newbar;
double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
if(newbar!=Time[0])
  {
   if(Bid > ma)
     {
      if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+SL*Point, Ask-TP*Point, NULL, MagicNumber, 0, Red))
         newbar=Time[0];
     }
   if(Ask < ma)
     {
      if(OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-SL*Point, Bid+TP*Point, NULL, MagicNumber, 0, Red))
         newbar=Time[0];
     }
  }

Если Вы хотите по одному в каждом направлении, то
C-подобный:
datetime b_newbar,s_newbar;
double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
if(s_newbar!=Time[0]&&Bid > ma)
  {
   if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+SL*Point, Ask-TP*Point, NULL, MagicNumber, 0, Red))
      s_newbar=Time[0];
  }
if(b_newbar!=Time[0]&&Ask < ma)
  {
   if(OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-SL*Point, Bid+TP*Point, NULL, MagicNumber, 0, Red))
      b_newbar=Time[0];
  }
еще раз спасибо, но не совсем понял ваш ответ, вижу что код разный, но в обеих случаях открываются ордера бай и селл, можете на практике сказать - в чём будет отличие работы этих кодов? :rolleyes:
 

MakarFX

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

Milord

Местный знаток
Ругается компилятор на ошибку в коде,как её исправить?
пытаюсь написать индикатор, но компилятор выдает ошибку -
'indicator_painttime' - unknown property ,указывая на одну и туже строку кода, пытался её написать в 3 вариантах,которые привожу ниже, но проблема не уходит, прошу уважаемых проггеров помочь в этом деле?
Код:
#property indicator_chart_window
#property indicator_buffers 0
//#property indicator_painttime 1
//#property indicator_painttime CHART_PAINT_ALL
#property indicator_painttime CHART_PAINT_FOREGROUND
 
Последнее редактирование:

zhserg

Местный знаток
Ругается компилятор на ошибку в коде,как её исправить?
пытаюсь написать индикатор, но компилятор выдает ошибку -
'indicator_painttime' - unknown property ,указывая на одну и туже строку кода, пытался её написать в 3 вариантах,которые привожу ниже, но проблема не уходит, прошу уважаемых проггеров помочь в этом деле?
Код:
#property indicator_chart_window
#property indicator_buffers 0
//#property indicator_painttime 1
//#property indicator_painttime CHART_PAINT_ALL
#property indicator_painttime CHART_PAINT_FOREGROUND
Свойства indicator_painttime нет в MQL, откуда это взяли?
 

Milord

Местный знаток
Как разделить максимальное число ордеров по стоповым и лимитным ордерам?
уважаемые проггеры,прошу вас добавить в этот код нужные строки,чтобы было раздельное по стоповым и лимитным ордерам максимальное число открытых отложек?
Код:
extern int MaxStopOrders = 2;  // Максимальное число открытых ордеров
extern int MaxLimitOrders = 2; // Максимальное число открытых ордеров
int start()
{
//--------------------------------
     {
      int ticketBuyStop = OrderSend(Symbol(), OP_BUYSTOP, Lots.... );
      int ticketSellStop = OrderSend(Symbol(), OP_SELLSTOP, Lots....);

      int ticketBuyLimit = OrderSend(Symbol(), OP_BUYLIMIT, Lots....);
      int ticketSellLimit = OrderSend(Symbol(), OP_SELLLIMIT, Lots....);
      }
//--------------------------------
return(0);
}
 

MakarFX

Элитный участник
Как разделить максимальное число ордеров по стоповым и лимитным ордерам?
C-подобный:
input int MaxStopOrders = 2;  // Максимальное число открытых ордеров
input int MaxLimitOrders = 2; // Максимальное число открытых ордеров
int start()
  {
   int buy_stop=0,sell_stop=0,buy_limit=0,sell_limit=0;
   for(i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(Magic==OrderMagicNumber()&&OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUYSTOP) buy_stop+=1;
            if(OrderType()==OP_SELLSTOP) sell_stop+=1;
            if(OrderType()==OP_BUYLIMIT) buy_limit+=1;
            if(OrderType()==OP_SELLLIMIT) sell_limit+=1;
           }
        }
     }
//--------------------------------
     {
      if(buy_stop<MaxStopOrders)
      int ticketBuyStop = OrderSend(Symbol(), OP_BUYSTOP, Lots....);
      if(sell_stop<MaxStopOrders)
      int ticketSellStop = OrderSend(Symbol(), OP_SELLSTOP, Lots....);

      if(buy_limit<MaxLimitOrders)
      int ticketBuyLimit = OrderSend(Symbol(), OP_BUYLIMIT, Lots....);
      if(sell_limit<MaxLimitOrders)
      int ticketSellLimit = OrderSend(Symbol(), OP_SELLLIMIT, Lots....);
     }
//--------------------------------
   return(0);
  }
 

Milord

Местный знаток
C-подобный:
input int MaxStopOrders = 2;  // Максимальное число открытых ордеров
input int MaxLimitOrders = 2; // Максимальное число открытых ордеров
int start()
  {
   int buy_stop=0,sell_stop=0,buy_limit=0,sell_limit=0;
   for(i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(Magic==OrderMagicNumber()&&OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUYSTOP) buy_stop+=1;
            if(OrderType()==OP_SELLSTOP) sell_stop+=1;
            if(OrderType()==OP_BUYLIMIT) buy_limit+=1;
            if(OrderType()==OP_SELLLIMIT) sell_limit+=1;
           }
        }
     }
//--------------------------------
     {
      if(buy_stop<MaxStopOrders)
      int ticketBuyStop = OrderSend(Symbol(), OP_BUYSTOP, Lots....);
      if(sell_stop<MaxStopOrders)
      int ticketSellStop = OrderSend(Symbol(), OP_SELLSTOP, Lots....);

      if(buy_limit<MaxLimitOrders)
      int ticketBuyLimit = OrderSend(Symbol(), OP_BUYLIMIT, Lots....);
      if(sell_limit<MaxLimitOrders)
      int ticketSellLimit = OrderSend(Symbol(), OP_SELLLIMIT, Lots....);
     }
//--------------------------------
   return(0);
  }
спасибо БОЛЬШОЕ за помощь!
еще уточните пожалуйста по одному фрагменту кода, разве не обязательно писать с фигурными скобками, как я ниже написал?
и почему вы заменили, во внешних переменных extern на input?
Код:
{
      if(buy_stop<MaxStopOrders)
      {
      int ticketBuyStop = OrderSend(Symbol(), OP_BUYSTOP, Lots....);
      }
      if(sell_stop<MaxStopOrders)
      {
      int ticketSellStop = OrderSend(Symbol(), OP_SELLSTOP, Lots....);
      }
}
 

MakarFX

Элитный участник
разве не обязательно писать с фигурными скобками
Если после условия одно действие, то не обязательно
наглядный пример
C-подобный:
         if(Magic==OrderMagicNumber()&&OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUYSTOP) buy_stop+=1;
            if(OrderType()==OP_SELLSTOP) sell_stop+=1;
            if(OrderType()==OP_BUYLIMIT) buy_limit+=1;
            if(OrderType()==OP_SELLLIMIT) sell_limit+=1;
           }

Для условия "if(Magic==OrderMagicNumber()&&OrderSymbol()==_Symbol)"
надо выполнить четыре запроса по каждому типу ордера, поэтому стоят скобки
Для условия "if(OrderType()==OP_BUYSTOP)"
надо выполнить одно действие, поэтому скобок нет
 

Отслеживают (499) Посмотреть

Верх