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

 
Mihail Matkovskij #:

Хотя не так. Нужно отслеживать результат работы 

или новой вашей функции в OnTradeTransaction. И если нет позиций, то входить. Или записывать сигнал в  buySignal или sellSignal и обрабатывать в OnTimer как я показал в примере.

ClosePosWithMaxProfitInCurrency

Эта функция уже не актуальна. Она не подходит. Место ее надо подставить функцию которая закроет один ордер открытый самым первым, если такой есть. 

Не пойму  Переменные buySignal и sellSignal прописал на глобальном уровне. Но при компиляции выдает 

'sellSignal' - some operator expected   

expression has no effect        

'buySignal' - some operator expected    

expression has no effect        



 

Добрый день. 

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

 
Добрый день, коллеги! Подскажите, пожалуйста, новичку, как получить текущее значение (в данный момент) индикатора, а не с предыдущего бара? Советник срабатывает только когда завершится предыдущий бар, а мне надо раньше.
 
makssub #:

Добрый день. 

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

Что именно не получается в сокращении кода?

 
Shockeir #:
Добрый день, коллеги! Подскажите, пожалуйста, новичку, как получить текущее значение (в данный момент) индикатора, а не с предыдущего бара? Советник срабатывает только когда завершится предыдущий бар, а мне надо раньше.

Возможно, более подробное описание ситуации и того что у вас самого не получается даст больший результат.

 
Andrey Sokolov #:

Возможно, более подробное описание ситуации и того что у вас самого не получается даст больший результат.

Индикатор стандартный Стохастик. Советник должен срабатывать на пересечении линий K и D. При самом пересечении, до появления нового бара, ничего не происходит. Как только появляется новый бар, если условие все еще выполняется, то происходит действие. Насколько я понял, это из-за того, что в буферах индикатора последнее значение - вычисленное на последнем завершенном баре. Так вот, хотелось бы, чтобы срабатываение происходило на еще незавершенном баре.

 
Shockeir #:

Индикатор стандартный Стохастик. Советник должен срабатывать на пересечении линий K и D. При самом пересечении, до появления нового бара, ничего не происходит. Как только появляется новый бар, если условие все еще выполняется, то происходит действие. Насколько я понял, это из-за того, что в буферах индикатора последнее значение - вычисленное на последнем завершенном баре. Так вот, хотелось бы, чтобы срабатываение происходило на еще незавершенном баре.

Последняя свечка имеет индекс 0.

И как сам пытался это решить? Справку читал? Что именно не получается?

 
Andrey Sokolov #:

Ты можешь код вставить? Чтоб хотя-бы на каком языке делаешь было понятно

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//--- input parameters
input double   crossDepthOpen=7;    //Глубина пересечения K и D для открытия
input double   crossDepthClose=-2;  //Глубина пересечения K и D для закрытия
input double   closeCoef=5;         //Коэффициент изменения глубины закрытия
input int      k_period=8;          //Период K
input int      d_period=3;          //Период В
input int      slowing=3;           //Сглаживание
input double   tp_1=20;             //Тейк
input double   sl_1=60;             //Лосс
input double   maxPos=2.0;          //Размер лота

int      stoch_handle;
double   k_buffer[1];
double   d_buffer[1];
double   TKP;
double   STL;
double   CDO;
double   CDC;
int      lossCount=0;
int      profitCount=0;
int      EA_magic=12345;


//| Expert initialization function

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   TKP=tp_1;
   STL=sl_1;

   stoch_handle=iStochastic(_Symbol,PERIOD_CURRENT,k_period,d_period,slowing,MODE_EMA,STO_LOWHIGH);
   if(stoch_handle<0)
     {
      Alert("Ошибка при создании индикаторов ",GetLastError());
      return(0);
     }
   return(INIT_SUCCEEDED);
  }

//| Expert tick function

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   CDO=crossDepthOpen;
   CDC=crossDepthClose;
   MqlTick latestPrice;
   MqlTradeResult mResult;
   MqlTradeRequest mRequest;
   ZeroMemory(mRequest);
   SymbolInfoTick(_Symbol,latestPrice);
   ArraySetAsSeries(k_buffer,true);
   ArraySetAsSeries(d_buffer,true);
   if(CopyBuffer(stoch_handle,0,0,1,k_buffer)<0)
     {
      Alert("Не удалось скопировать в буфер K",GetLastError());
      return;
     }
   if(CopyBuffer(stoch_handle,1,0,1,d_buffer)<0)
     {
      Alert("Не удалось скопировать в буфер D",GetLastError());
      return;
     }

   bool buyFullOpened=false;
   bool buyPartOpened=false;
   bool sellFullOpened=false;
   bool sellPartOpened=false;

//Состояние позиций
   if(PositionSelect(_Symbol)==true)
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         if(PositionGetDouble(POSITION_VOLUME)>=maxPos)
           {
            buyFullOpened=true;
           }
         else
           {
            buyPartOpened=true;
           }
        }
      else
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
           {

            if(PositionGetDouble(POSITION_VOLUME)>=maxPos)
              {
               sellFullOpened=true;
              }
            else
              {
               sellPartOpened=true;
              }
           }
     }
//состояние позиций конец

//Условия изменения позиций
   bool buyOpenCondition=k_buffer[0]>((d_buffer[0])+CDO);
   bool buyCloseCondition=k_buffer[0]<((d_buffer[0])-CDC);
   bool buyTPCondition=latestPrice.bid>(PositionGetDouble(POSITION_PRICE_OPEN)+TKP*_Point);
   bool buySLCondition=latestPrice.bid<(PositionGetDouble(POSITION_PRICE_OPEN)-STL*_Point);
   bool sellOpenCondition=k_buffer[0]<((d_buffer[0])-CDO);
   bool sellCloseCondition=k_buffer[0]>((d_buffer[0])+CDC);
   bool sellTPCondition=latestPrice.ask<(PositionGetDouble(POSITION_PRICE_OPEN)-TKP*_Point);
   bool sellSLCondition=latestPrice.ask>(PositionGetDouble(POSITION_PRICE_OPEN)+STL*_Point);
//Условия изменения позиций конец

//Проверка и выполнение действий
   if(buyOpenCondition)
     {
      if(!buyFullOpened && !buyPartOpened && !sellPartOpened && !sellFullOpened)
        {
         Print("Покупка по сигналу");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.ask,_Digits);
         mRequest.sl = 0; //NormalizeDouble(latestPrice.ask - STL*Point(),_Digits);
         mRequest.tp = 0; //NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = maxPos;
         OrderSend(mRequest,mResult);
         Print("Открыто ",PositionGetDouble(POSITION_VOLUME)," по ", PositionGetDouble(POSITION_PRICE_OPEN));
        }
     }
//Условия покупки
   if(sellTPCondition)
     {
      if(sellFullOpened)
        {
         Print("Тейк-профит шорта");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.ask,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = MathRound(PositionGetDouble(POSITION_VOLUME)/2);
         OrderSend(mRequest,mResult);
         ++profitCount;
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }

   if(sellSLCondition)
     {
      if(sellFullOpened || sellPartOpened)
        {
         Print("Стоп-лосс шорта");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.ask,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = PositionGetDouble(POSITION_VOLUME);
         OrderSend(mRequest,mResult);
         ++lossCount;
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }

   if(sellCloseCondition)
     {
      if(sellFullOpened || sellPartOpened)
        {
         Print("Закрытие шорта по сигналу");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         Print(k_buffer[0]," ",d_buffer[0]);
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.ask,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = PositionGetDouble(POSITION_VOLUME);
         OrderSend(mRequest,mResult);
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }

//Условия продажи
   if(sellOpenCondition)
     {
      if(!sellFullOpened && !buyPartOpened && !sellPartOpened && !buyFullOpened)
        {
         Print("Продажа по сигналу");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         Print(k_buffer[0]," ",d_buffer[0]);
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.bid,_Digits);
         mRequest.sl = 0; //NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0; //NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = maxPos;
         OrderSend(mRequest,mResult);
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }
   if(buyTPCondition)
     {
      if(buyFullOpened)
        {
         Print("Тейк-профит лонга");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.bid,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = MathRound(PositionGetDouble(POSITION_VOLUME)/2);
         OrderSend(mRequest,mResult);
         ++profitCount;
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }

   if(buySLCondition)
     {
      if(buyFullOpened || buyPartOpened)
        {
         Print("Стоп-лосс лонга");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         Print(k_buffer[0]," ",d_buffer[0]);
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.bid,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = PositionGetDouble(POSITION_VOLUME);
         OrderSend(mRequest,mResult);
         ++lossCount;
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }

   if(buyCloseCondition)
     {
      if(buyFullOpened || buyPartOpened)
        {
         Print("Закрытие лонга по сигналу");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         Print(k_buffer[0]," ",d_buffer[0]);
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.bid,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = PositionGetDouble(POSITION_VOLUME);
         OrderSend(mRequest,mResult);
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---

  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   IndicatorRelease(stoch_handle);
   Print("loss ",lossCount);
   Print("profit ",profitCount);
  }
//+------------------------------------------------------------------+
Andrey Sokolov #:

Ты можешь код вставить? Чтоб хотя-бы на каком языке делаешь было понятно

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

GlaVredFX, 2022.01.17 22:52

ClosePosWithMaxProfitInCurrency

Эта функция уже не актуальна. Она не подходит. Место ее надо подставить функцию которая закроет один ордер открытый самым первым, если такой есть. 

Не пойму  Переменные buySignal и sellSignal прописал на глобальном уровне. Но при компиляции выдает 

'sellSignal' - some operator expected   

expression has no effect        

'buySignal' - some operator expected    

expression has no effect        



Как прописывали и где компилятор ругается? Я не могу угадывать. Чтобы понять нужен исходный код.
 
Shockeir #:
Добрый день, коллеги! Подскажите, пожалуйста, новичку, как получить текущее значение (в данный момент) индикатора, а не с предыдущего бара? Советник срабатывает только когда завершится предыдущий бар, а мне надо раньше.

В массивах  k_buffer[0] и d_buffer[0] последние значения индикатора. В чем проблема вывести их и самому посмотреть?

Причина обращения: