Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2127

 
Vitaly Murlenko #:


Теперь что касается работы кода. Компилятор (это как минимум) ругается на то, что в коде в подпрограмму передаётся массив. Передаётся некорректно. Не по правилам языка.

Когда-то были другие правила и всё работало.

 
Alexey Viktorov #:

Когда-то были другие правила и всё работало.

Я помню. У меня до сих пор есть хелп по языку MQL2

 
   Добрый день, можно спросить совет 
советник на mlq4,
Мартингейл,
сигналы ищет с помощью МА+RSI,
   Вход и модификация в сделку на новой свече,
Задал во внешних переменных:
-Тейкпофит
-Лот
-Шаг между ордерами 
-коэффициент умножения .
   При работе отрабатывает хорошо, модифицирует нормально , но на первом ордере выставляет тейкпофит разный 
В настройках стоит 30, а выставляет 25-40 почему так происходит ?

 
Karll123 #:
          
   При работе отрабатывает хорошо, модифицирует нормально , но на первом ордере выставляет тейкпофит разный 
В настройках стоит 30, а выставляет 25-40 почему так происходит ?

Потому что так в советнике запрограммировано.

 
Karll123 #:
   Добрый день, можно спросить совет 
советник на mlq4,
Мартингейл,
сигналы ищет с помощью МА+RSI,
   Вход и модификация в сделку на новой свече,
Задал во внешних переменных:
-Тейкпофит
-Лот
-Шаг между ордерами 
-коэффициент умножения .
   При работе отрабатывает хорошо, модифицирует нормально , но на первом ордере выставляет тейкпофит разный 
В настройках стоит 30, а выставляет 25-40 почему так происходит ?

Надо видеть код открытия ордеров. Или обратись сюда
 

Tretyakov Rostyslav #:
Надо видеть код открытия ордеров. Или обратись сюда

Спасибо.

Прилагаю код, Выделил условия и открытие первого ордера

//+++++

//+------------------------------------------------------------------+
//|                                                         TEST.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property strict

extern double         Fix_Lots   = 0;       //Fix_Lots
extern double         Lots       = 0.01;    //Lots   
extern int            TakeProfit = 30;      //Tp
extern int            Step       = 100;     //Step(Шаг)
extern double         Multiplier = 1.8;     //Multipler(Коэффициент умножения)
extern int            Magic      = 123;     //Magic
extern int            MAA        = 120;     //Период МА
input ENUM_TIMEFRAMES tf_2       = 0;       //TimeFrameMA

int timeprev =0;                            // TimeOpenOrders

int ticket;
double tp, price, lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
double Lots_D = NormalizeDouble((AccountBalance()/1000)*Lots,2); // Динамический лот
 if (Fix_Lots != 0)
 {
 (Lots_D=Fix_Lots);
 }
double RSI_Hi_Level = 70;
double RSI_Lo_Level = 30;
double Bar_1 = Close[1]-Open[1];
double ima_120 = iMA(Symbol(),tf_2, MAA, 0, MODE_SMA, PRICE_OPEN, 0);
double ima_4 = iMA(Symbol(),tf_2, 4, 0, MODE_SMA, PRICE_OPEN, 0);
double irsi = iRSI(Symbol(),0,14,PRICE_OPEN,0);

       if (timeprev == Time[0]) return;   //Открытие на новой свече 
           timeprev = Time[0];
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    if(CountTrades() ==0) // Если сделок нет то 
    {
       if (Ask > ima_120 && ima_4 > ima_120 && irsi < RSI_Hi_Level && irsi > RSI_Lo_Level && Bar_1 > 0)
       {   tp = NormalizeDouble(Ask + TakeProfit*Point, Digits);
           ticket = OrderSend(Symbol(), OP_BUY, Lots_D, Ask, 5, 0, tp, "1-й ордер", Magic, 0, Blue);
       }
    }
    if (CountTrades() ==0) // Если сделок нет то 
    {
       if (Bid < ima_120 && ima_4 < ima_120 && irsi < RSI_Hi_Level && RSI_Lo_Level && Bar_1 <0)
       {   tp = NormalizeDouble(Bid - TakeProfit*Point, Digits);
           ticket = OrderSend(Symbol(), OP_SELL, Lots_D, Bid, 5, 0, tp, "1-й ордер", Magic, 0, Red);
       }
     }
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     else     // Если есть первый ордер то
     {
         int order_type = FindLastOrderType();
         if (order_type == OP_BUY)
         {
             price = FindLastOrderPrice(OP_BUY);
             if (Ask <= price - Step*Point)
             {
                 lastlot = FindLastLots(OP_BUY);
                 lastlot = NormalizeDouble(lastlot * Multiplier, 2);
                 ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0, 0, "", Magic, 0, Blue);
                 if (ticket <1)
                     Print("Ошибка открытия ордера на покупку!");
                 ModifyOrders(OP_BUY);
             }
         }
                 if (order_type == OP_SELL)
         {
             price = FindLastOrderPrice(OP_SELL);
             if (Bid >= price + Step*Point)
             {
                 lastlot = FindLastLots(OP_SELL);
                 lastlot = NormalizeDouble(lastlot * Multiplier, 2);
                 ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0, 0, "", Magic, 0, Red);
                 if (ticket <1)
                    Print("Ошибка открытия ордера на продажу!");
                 ModifyOrders(OP_SELL);
             }
         }
     }    
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
     double avg_price, order_lots=0;
     price = 0;
     
     for (int i=OrdersTotal()-1; i>=0; i--)
     {
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
          {
              if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() ==otype)
              {
                 price += OrderOpenPrice() * OrderLots();
                 order_lots += OrderLots();
              }
          }
     }
     avg_price = NormalizeDouble(price / order_lots, Digits);
     
          if (otype == OP_BUY)  tp = NormalizeDouble (avg_price + TakeProfit*Point, Digits);
          if (otype == OP_SELL) tp = NormalizeDouble (avg_price - TakeProfit*Point, Digits);
          
          for (int i=OrdersTotal()-1; i>=0; i--)
          {
               if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))
               {
                   if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
                   {
                      if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                         Print("Ордера успешно модифицированы!");
                      else Print("Ошибка модификации ордера!");
                   }
               }
          }
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
    int oldticket;
    double oldlots=0;
    ticket=0;
    
    for (int cnt=OrdersTotal()-1; cnt>=0; cnt--)
    {
        if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
        {
           if (OrderSymbol()== Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
              oldticket = OrderTicket();
              if (oldticket > ticket)
              {
                 ticket = oldticket;
                 oldlots = OrderLots();
              }
           }
        }
    }
    return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
    int oldticket;
    double oldopenprice=0;
    ticket=0;
    
    for (int cnt=OrdersTotal()-1; cnt>=0; cnt--)
    {
        if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
        {
           if (OrderSymbol()== Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
              oldticket = OrderTicket();
              if (oldticket > ticket)
              {
                 ticket = oldticket;
                 oldopenprice = OrderOpenPrice();
              }
           }
        }
    }
    return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType() 
 {
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
           if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               return(OrderType());
        }
    }
    return(-1);
 }
//+------------------------------------------------------------------+
int CountTrades() //Счетчик ордеров
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
        {
           if (OrderSymbol() ==Symbol() && OrderMagicNumber() == Magic)
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                   count++;
        }
    }
    return(count);
}
Файлы:
TEST.mq4  16 kb
 
Karll123 #:

Спасибо.

Прилагаю код, Выделил условия и открытие первого ордера

//+++++

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

Открывай ордера без тейка, а потом сделай модификацию.

 
Tretyakov Rostyslav #:

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

Открывай ордера без тейка, а потом сделай модификацию.

Спасибо большое, попробую

 

здравствуйте все! у меня вопрос к экспертам подскажите как узнать значение любого пользовательского индикатора на последнем тике и предпоследнем тике ?

заранее спасибо

 
khasan kayumov #:

здравствуйте все! у меня вопрос к экспертам подскажите как узнать значение любого пользовательского индикатора на последнем тике и предпоследнем тике ?

заранее спасибо

Функция iCustom Вам поможет.
Причина обращения: