Ваши вопросы по языку 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);
}
 

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)"
надо выполнить одно действие, поэтому скобок нет
 

star603

Новичок форума
Код:
//+------------------------------------------------------------------+
//|                                                    NewTarget.mq4 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
int BarIndexSell[4];//Индекс продаж
int BarIndexBuy[4];//Индекс покупок
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   PereborSar();
   Comment("#1=","   ",Time[BarIndexBuy[0]],"\n",
           "#2=","   ",Time[BarIndexBuy[1]],"\n",
           "#3=","   ",Time[BarIndexBuy[2]],"\n",
           "#4=","   ",Time[BarIndexBuy[3]]);
  }
//+------------------------------------------------------------------+
double GetSARValue(int barIndex)
  {
// возвращает значение SAR на заданном баре
   return iSAR(NULL, 0, 0.02, 0.2, barIndex);
  }
//+------------------------------------------------------------------+
int Uslovie_1()
  {
   int i = 0;
   if(GetSARValue(1)>Open[1] && Open[0]>GetSARValue(0))
      i=1;
   if(GetSARValue(1)<Open[1] && Open[0]<GetSARValue(0))
      i=2;
   return(i);
  }
//-------------------------Выше этой строки все работает-------------+
void PereborSar()
  {
   if(Uslovie_1()==1)
      for(int i = 0; i<61; i++)
        {
         while((GetSARValue(i+1)>Open[i+1]) &&(GetSARValue(i)<Open[i]))
            BarIndexBuy[0]=i;
         while((GetSARValue(i+1)<Open[i+1]) &&(GetSARValue(i)>Open[i]))
           {
            BarIndexBuy[1]=i;
            BarIndexBuy[2]=i+1;
           }
         while((GetSARValue(i+1)>Open[i+1]) &&(GetSARValue(i)<Open[i]))
            BarIndexBuy[3]=i;
         break;
        }
  };
//+------------------------------------------------------------------+

Не заполняется массив BarIndexSar
 

Вложения

  • Безымянный123.png
    Безымянный123.png
    225,3 КБ · Просмотры: 14
Последнее редактирование:

ИванМН

Местный знаток
Не заполняется массив BarIndexSar
Нет такого массива. Есть BarIndexBuy и BarIndexSell.

Всё коряво и громоздко. Рекомендую функцию GetSARValue переделать под возвращаемое значение типа char, где значение 0 - нет сигнала, 1 - Парабол повернулся вверх, -1 - Парабол повернулся вниз. А в функции PereborSAR switch'ем организовать отлов смены направления Параболом и занесение в массив номеров баров, на которых эта смена происходила.
 

star603

Новичок форума
Нет такого массива. Есть BarIndexBuy и BarIndexSell.

Всё коряво и громоздко. Рекомендую функцию GetSARValue переделать под возвращаемое значение типа char, где значение 0 - нет сигнала, 1 - Парабол повернулся вверх, -1 - Парабол повернулся вниз. А в функции PereborSAR switch'ем организовать отлов смены направления Параболом и занесение в массив номеров баров, на которых эта смена происходила.
Код:
//+------------------------------------------------------------------+
//|                                                    NewTarget.mq4 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
int BarIndexSell[4];//Индекс продаж
int BarIndexBuy[4];//Индекс покупок
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   PereborSar(GetSARValue(1,0,0));
   Comment("#1=","   ",BarIndexBuy[0],"\n",
           "#2=","   ",BarIndexBuy[1],"\n",
           "#3=","   ",BarIndexBuy[2],"\n",
           "#4=","   ",BarIndexBuy[3],"\n",
           "S=", "   ",GetSARValue(1,0,0));
  }
//+------------------------------------------------------------------+
char GetSARValue(int bar_1, int bar_0, char s)
  {
   if(iSAR(NULL, 0, 0.02, 0.2, bar_1)>Open[bar_1] && iSAR(NULL, 0, 0.02, 0.2, bar_0)<Open[bar_0])
      s=1;
   else
      if(iSAR(NULL, 0, 0.02, 0.2, bar_1)
         <Open[bar_1] && iSAR(NULL, 0, 0.02, 0.2, bar_0)>Open[bar_0])
         s=2;
   return(s);
  }
//+------------------------------------------------------------------+
void PereborSar(int g)
  {
   switch(g)
     {
      case 1:
         for(int i=0; i<61; i++)
           {
            while(GetSARValue(i+1,i,1)==1)
               BarIndexBuy[0]=i;
            while(GetSARValue(i+1,i,1)==2)
              {
               BarIndexBuy[1]=i;
               BarIndexBuy[2]=i+1;
              }
            while(GetSARValue(i+1,i,1)==1)
               BarIndexBuy[3]=i;
           }
         break;
      case 2:
         break;
     }
  };
//+------------------------------------------------------------------+

Пока не заполняет
 

Посмотрели (157) Посмотреть

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

Верх