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

Раздел: Язык программирования MQL4
Автор темы: chocolate
Создана: 2011-11-07 10:37
Ответов: 9576 | Просмотров: 1107100
Страница 475 из 479
Источник: https://forexsystemru.com/threads/65289/page-475

---

## Milord — 2024-12-02 01:10

**Всем привет, возник вопрос?**
давно не был на форуме, язык малость подзабыл, тем более в новых билдах много изменений, вопрос в следующем:
 - нужен кусок  кода,который бы заставлял открывать ордера , так чтобы на каждом новом баре открывалось не более 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 — 2024-12-02 01:57

> Цитата (Milord):
> нужен кусок кода

```
datetime newbar;
int start()
  {
   double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
   if(newbar!=Time&&Bid > ma)
     {
      if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+StopLoss*Point, Ask-TakeProfit*Point, NULL, MagicNumber, 0, Red))
      newbar=Time;
     }

   return(0);
  }

```

## Milord — 2024-12-02 02:16

> Цитата (MakarFX):
> 
```
datetime newbar;
> int start()
>   {
>    double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
>    if(newbar!=Time&&Bid > ma)
>      {
>       if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+StopLoss*Point, Ask-TakeProfit*Point, NULL, MagicNumber, 0, Red))
>       newbar=Time;
>      }
>
>    return(0);
>   }
> 
```

спасибо за ответ, и еще вопрос , если для ордеров бай, тоже добавить открытие на каждом баре не более 1 ордера, то общий код вот так правильно писать?

```
double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
   if(newbar!=Time&&Bid > ma)
     {
      if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+SL*Point, Ask-TP*Point, NULL, MagicNumber, 0, Red))
      newbar=Time;
     }

   if(newbar!=Time&&Ask < ma)
     {
      if(OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-SL*Point, Bid+TP*Point, NULL, MagicNumber, 0, Red))
      newbar=Time;
     }
```

## MakarFX — 2024-12-02 10:33

> Цитата (Milord):
> спасибо за ответ, и еще вопрос , если для ордеров бай, тоже добавить открытие на каждом баре не более 1 ордера

Если Вы хотите только один ордер и только в одном направлении, то

```
datetime newbar;
double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
if(newbar!=Time)
  {
   if(Bid > ma)
     {
      if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+SL*Point, Ask-TP*Point, NULL, MagicNumber, 0, Red))
         newbar=Time;
     }
   if(Ask < ma)
     {
      if(OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-SL*Point, Bid+TP*Point, NULL, MagicNumber, 0, Red))
         newbar=Time;
     }
  }
```

Если Вы хотите по одному в каждом направлении, то

```
datetime b_newbar,s_newbar;
double ma = iMA(NULL, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
if(s_newbar!=Time&&Bid > ma)
  {
   if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+SL*Point, Ask-TP*Point, NULL, MagicNumber, 0, Red))
      s_newbar=Time;
  }
if(b_newbar!=Time&&Ask < ma)
  {
   if(OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-SL*Point, Bid+TP*Point, NULL, MagicNumber, 0, Red))
      b_newbar=Time;
  }

```

## vladradon — 2024-12-02 10:57

> Цитата (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);
> }
```

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

## Milord — 2024-12-02 18:25

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

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

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

## MakarFX — 2024-12-02 20:10

> Цитата (Milord):
> еще раз спасибо, но не совсем понял ваш ответ, вижу что код разный, но в обеих случаях открываются ордера бай и селл, можете на практике сказать - в чём будет отличие работы этих кодов? :rolleyes:

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

## Milord — 2024-12-03 01:05

**Ругается компилятор на ошибку в коде,как её исправить?**
пытаюсь написать индикатор, но компилятор выдает ошибку -
'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 — 2024-12-03 04:29

> Цитата (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
```

Свойства indicator_painttime нет в MQL, откуда это взяли?

## Milord — 2024-12-03 07:07

> Цитата (zhserg):
> Свойства indicator_painttime нет в MQL, откуда это взяли?

спасибо, уже решил проблему, это мне тупой ИИ написал часть кода:)

## MakarFX — 2024-12-03 10:29

> Цитата (Milord):
> indicator_painttime CHART_PAINT_ALL

> Цитата (Milord):
> indicator_painttime CHART_PAINT_FOREGROUND

А что это?
Что Вы хотите сделать?

## Milord — 2024-12-03 10:32

> Цитата (MakarFX):
> А что это?
> Что Вы хотите сделать?

спасибо,уже решена проблема:)

## Milord — 2024-12-03 21:20

**Как разделить максимальное число ордеров по стоповым и лимитным ордерам?**
уважаемые проггеры,прошу вас добавить в этот код нужные строки,чтобы было раздельное по стоповым и лимитным ордерам максимальное число открытых отложек?

```
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 — 2024-12-03 23:30

> Цитата (Milord):
> **Как разделить максимальное число ордеров по стоповым и лимитным ордерам?**
> уважаемые проггеры,прошу вас добавить в этот код нужные строки

ИИ не хочет помогать?

## MakarFX — 2024-12-04 00:31

> Цитата (Milord):
> Как разделить максимальное число ордеров по стоповым и лимитным ордерам?

```
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 — 2024-12-04 01:24

> Цитата (MakarFX):
> 
```
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 — 2024-12-04 01:46

> Цитата (Milord):
> разве не обязательно писать с фигурными скобками

Если после условия одно действие, то не обязательно
наглядный пример

```
         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 — 2024-12-08 19:38

```
//+------------------------------------------------------------------+
//|                                                    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;//Индекс продаж
int BarIndexBuy;//Индекс покупок
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   PereborSar();
   Comment("#1=","   ",Time[BarIndexBuy],"\n",
           "#2=","   ",Time[BarIndexBuy],"\n",
           "#3=","   ",Time[BarIndexBuy],"\n",
           "#4=","   ",Time[BarIndexBuy]);
  }
//+------------------------------------------------------------------+
double GetSARValue(int barIndex)
  {
// возвращает значение SAR на заданном баре
   return iSAR(NULL, 0, 0.02, 0.2, barIndex);
  }
//+------------------------------------------------------------------+
int Uslovie_1()
  {
   int i = 0;
   if(GetSARValue(1)>Open && Open>GetSARValue(0))
      i=1;
   if(GetSARValue(1)<Open && Open<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))
            BarIndexBuy=i;
         while((GetSARValue(i+1)<Open[i+1]) &&(GetSARValue(i)>Open))
           {
            BarIndexBuy=i;
            BarIndexBuy=i+1;
           }
         while((GetSARValue(i+1)>Open[i+1]) &&(GetSARValue(i)<Open))
            BarIndexBuy=i;
         break;
        }
  };
//+------------------------------------------------------------------+

```

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

## ИванМН — 2024-12-08 20:07

> Цитата (star603):
> Не заполняется массив BarIndexSar

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

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

## star603 — 2024-12-08 20:37

> Цитата (ИванМН):
> Нет такого массива. Есть 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;//Индекс продаж
int BarIndexBuy;//Индекс покупок
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   PereborSar(GetSARValue(1,0,0));
   Comment("#1=","   ",BarIndexBuy,"\n",
           "#2=","   ",BarIndexBuy,"\n",
           "#3=","   ",BarIndexBuy,"\n",
           "#4=","   ",BarIndexBuy,"\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 && iSAR(NULL, 0, 0.02, 0.2, bar_0)<Open)
      s=1;
   else
      if(iSAR(NULL, 0, 0.02, 0.2, bar_1)
         <Open && iSAR(NULL, 0, 0.02, 0.2, bar_0)>Open)
         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=i;
            while(GetSARValue(i+1,i,1)==2)
              {
               BarIndexBuy=i;
               BarIndexBuy=i+1;
              }
            while(GetSARValue(i+1,i,1)==1)
               BarIndexBuy=i;
           }
         break;
      case 2:
         break;
     }
  };
//+------------------------------------------------------------------+
```

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

---

Следующая страница: https://forexsystemru.com/threads/65289/page-476
