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

 
Ищу кто поможет начинающему MQL программисту доработать код советника за отдельную плату

Дано:

...

 
Mike Weiss #:
Ищу кто поможет начинающему MQL программисту доработать код советника за отдельную плату

Дано:

...

Сюда, пожалуйста:

Торговые приложения для MetaTrader 5 на заказ
Торговые приложения для MetaTrader 5 на заказ
  • 2022.11.07
  • www.mql5.com
Самый большой фриланс c разработчиками программ на MQL5
 

Приветствую! Не понимаю как ограничить число ордеров у советника...Метод со счетчиком написал, а как привязать его к ордерам на графике не пойму

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

//+------------------------------------------------------------------+
//|                                             MA_SELL_Strategy.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade/AccountInfo.mqh>
CAccountInfo aInfo;
#include <Trade/PositionInfo.mqh>
CPositionInfo pInfo;
#include <Trade/Trade.mqh>
CTrade trade;
//--- input parameters
input int maPeriod=12;
input ENUM_APPLIED_PRICE maPrice = PRICE_CLOSE;
input ENUM_MA_METHOD maMethod = MODE_EMA;
input double lot = 0.1;
input int maxPos = 5;
int count=5;
//------------MA variables-----------
ulong magicNum = 555;
int maHandle=INVALID_HANDLE;
double maBuffer[];
MqlRates mqlRates[];//хранит данные о баре
MqlTick mqlTick[]; //хранит данные о цене
double priceClose;
//-----------MA Time-----------------
datetime firstTime;
datetime curTime[];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   maHandle=iMA(_Symbol, _Period, maPeriod, 0, maMethod, maPrice);
   if(maHandle == INVALID_HANDLE) {
      Print("Ошибка загрузки индикатора МА ошибка ", GetLastError());
      return(INIT_FAILED);
   }
   trade.SetExpertMagicNumber(magicNum);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
   IndicatorRelease(maHandle);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   ArraySetAsSeries(maBuffer, true);
   ArraySetAsSeries(mqlRates, true);
   ArraySetAsSeries(mqlTick, true);

   if(CopyTime(_Symbol, _Period, 0, 1, curTime)==-1) {
      Print("Ошибка копирования данных о времени. Ошибка ", GetLastError());
      return;
   }
   if(CopyRates(_Symbol, _Period, 0, 3, mqlRates)==-1) {
      Print("Ошибка копирования исторических данных. Ошибка ", GetLastError());
      return;
   }
   if(CopyBuffer(maHandle, 0, 0, 3, maBuffer)==-1) {
      Print("Ошибка копирования данных MA. Ошибка ", GetLastError());
      return;
   }
   if(curTime[0]!=firstTime) {
      priceClose = mqlRates[1].close;
      if(!openSellPosition()) {
         return;
      }
      if(checkPositionCount(count)==-1) {
         return;
      }
      firstTime=curTime[0];
   }

}
//+------------------------------------------------------------------
bool openSellPosition() {
   if(maBuffer[0]<maBuffer[1] && maBuffer[1]<maBuffer[2]) {
      if(priceClose<maBuffer[1]) {
         trade.Sell(lot);
      }
   }
   return(true);
}
//--------------------------------------------------------------------
int checkPositionCount(int cnt) {
   cnt=PositionsTotal();
   while(cnt<5) {
      cnt++;
      Print("count", cnt);
   }
   return(cnt);
}
//+------------------------------------------------------------------+
 

Думал сбой кластера. Перенес на другой, не помогло.

Нашел сбой. Ошибка индекса в массиве.

 
kirillyurkov #:

Приветствую! Не понимаю как ограничить число ордеров у советника...Метод со счетчиком написал, а как привязать его к ордерам на графике не пойму

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

Добавить в функцию установки ордеров еще одно условие:

if(PositionsTotal()<5)
 
FxPro7009 #:

Добавить в функцию установки ордеров еще одно условие:

Ооо!! Спасибо!!Тоесть обязательно if(PositionsTotal()<5) ? цикл while(PositionsTotal()<5){} не сработает?

Код дебажил. Счетчик работает. Только на Количество открытых ордеров это не влияет. Робот из шпарит без остановки

Или имелось в виду в функцию openSellPosition(){}?

Завтра попробую! Благодарочка, дружище!!!!

 

Там, где советник открывает сделки на каждом баре если выполняется условие, добавить PositionsTotal() < maxPos

Считать/пересчитывать их не вижу смысла.

 

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

С уважением, Владимир.

//+------------------------------------------------------------------+
//|                                             MA_SELL_Strategy.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade/AccountInfo.mqh>
CAccountInfo aInfo;
#include <Trade/PositionInfo.mqh>
CPositionInfo pInfo;
#include <Trade/Trade.mqh>
CTrade trade;
//--- input parameters
input int maPeriod=12;
input ENUM_APPLIED_PRICE maPrice = PRICE_CLOSE;
input ENUM_MA_METHOD maMethod = MODE_EMA;
input double lot = 0.1;
input int maxPos = 5;
//------------MA variables-----------
ulong magicNum = 555;
int maHandle;
double maBuffer[];
MqlRates mqlRates[];//хранит данные о баре
MqlTick mqlTick[]; //хранит данные о цене
double priceClose;
//-----------MA Time-----------------
datetime firstTime;
datetime curTime[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   maHandle=iMA(_Symbol, _Period, maPeriod, 0, maMethod, maPrice);
   if(maHandle == INVALID_HANDLE)
     {
      Print("Ошибка загрузки индикатора МА ошибка ", GetLastError());
      return(INIT_FAILED);
     }
   trade.SetExpertMagicNumber(magicNum);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(maHandle);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   ArraySetAsSeries(maBuffer, true);
   ArraySetAsSeries(mqlRates, true);
   ArraySetAsSeries(mqlTick, true);

   if(CopyTime(_Symbol, _Period, 0, 1, curTime)==-1)
     {
      Print("Ошибка копирования данных о времени. Ошибка ", GetLastError());
      return;
     }
   if(CopyRates(_Symbol, _Period, 0, 3, mqlRates)==-1)
     {
      Print("Ошибка копирования исторических данных. Ошибка ", GetLastError());
      return;
     }
   if(CopyBuffer(maHandle, 0, 0, 3, maBuffer)==-1)
     {
      Print("Ошибка копирования данных MA. Ошибка ", GetLastError());
      return;
     }
   if(curTime[0]!=firstTime)
     {
      priceClose = mqlRates[1].close;
      if(!openSellPosition())
        {
         return;
        }
      firstTime=curTime[0];
     }
  }
//+------------------------------------------------------------------
bool openSellPosition()
  {
   if(maBuffer[0]<maBuffer[1] && maBuffer[1]<maBuffer[2])
     {
      if(priceClose<maBuffer[1] && PositionsTotal()<maxPos)
        {
         trade.Sell(lot);
        }
     }
   return(true);
  }
//+------------------------------------------------------------------+
 
FxPro7009 #:

Там, где советник открывает сделки на каждом баре если выполняется условие, добавить PositionsTotal() < maxPos

Считать/пересчитывать их не вижу смысла.

Благодарю!!! 
 
MrBrooklin #:

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

С уважением, Владимир.

Благодарю!!!
Причина обращения: