Skip to content

Commit

Permalink
EA/Strategy: Improves logic for opening new trades
Browse files Browse the repository at this point in the history
  • Loading branch information
kenorb committed Aug 29, 2021
1 parent a3d7815 commit ce67825
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 18 deletions.
9 changes: 2 additions & 7 deletions EA.mqh
Original file line number Diff line number Diff line change
Expand Up @@ -260,15 +260,10 @@ class EA {
virtual bool TradeRequest(ENUM_ORDER_TYPE _cmd, string _symbol = NULL, Strategy *_strat = NULL) {
Trade *_trade = trade.GetByKey(_symbol);
// Prepare a request.
MqlTradeRequest _request = {(ENUM_TRADE_REQUEST_ACTIONS)0};
_request.action = TRADE_ACTION_DEAL;
_request.comment = _strat.GetOrderOpenComment(); // @todo: Add GetOrderCloseComment().
_request.deviation = 10;
MqlTradeRequest _request = _trade.GetTradeRequest(_cmd);
_request.comment = _strat.GetOrderOpenComment();
_request.magic = _strat.Get<long>(STRAT_PARAM_ID);
_request.price = SymbolInfoStatic::GetOpenOffer(_symbol, _cmd);
_request.symbol = _symbol;
_request.type = _cmd;
_request.type_filling = Order::GetOrderFilling(_request.symbol);
_request.volume = fmax(_strat.Get<float>(STRAT_PARAM_LS), SymbolInfoStatic::GetVolumeMin(_symbol));
_request.volume = _trade.NormalizeLots(_request.volume);
// Prepare an order parameters.
Expand Down
4 changes: 2 additions & 2 deletions Strategy.mqh
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ class Strategy : public Object {
DictStruct<long, Ref<Order>> *_orders_active = _trade.GetOrdersActive();
for (DictStructIterator<long, Ref<Order>> iter = _orders_active.Begin(); iter.IsValid(); ++iter) {
_order = iter.Value().Ptr();
if (_order.IsOpen() && _order.Get<long>(ORDER_MAGIC) == sparams.Get<long>(STRAT_PARAM_ID)) {
if (_order.IsOpen() && _order.Get(ORDER_MAGIC) == sparams.Get<long>(STRAT_PARAM_ID)) {
OrderData _odata = _order.GetData();
Strategy *_strat_sl = strat_sl;
Strategy *_strat_tp = strat_tp;
Expand Down Expand Up @@ -882,7 +882,7 @@ class Strategy : public Object {
// 1st (i:0) - Trade's enum action to execute.
// 2rd (i:1) - Trade's argument to pass.
if (arg_size > 0) {
MqlParam _sargs[];
DataParamEntry _sargs[];
ArrayResize(_sargs, ArraySize(_args) - 1);
for (int i = 0; i < ArraySize(_sargs); i++) {
_sargs[i] = _args[i + 1];
Expand Down
2 changes: 1 addition & 1 deletion Trade.mqh
Original file line number Diff line number Diff line change
Expand Up @@ -1670,7 +1670,7 @@ HistorySelect(0, TimeCurrent()); // Select history for access.
}
}
bool ExecuteAction(ENUM_TRADE_ACTION _action) {
DataParamEntry _args[] = {};
DataParamEntry _args[];
return Trade::ExecuteAction(_action, _args);
}
bool ExecuteAction(ENUM_TRADE_ACTION _action, long _arg1) {
Expand Down
1 change: 0 additions & 1 deletion Trade.struct.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,6 @@ struct TradeParams {
unsigned int GetLimits(ENUM_TRADE_STAT_TYPE _type, ENUM_TRADE_STAT_PERIOD _period) {
return limits_stats[_type][_period];
}
unsigned long GetMagicNo() { return magic_no; }
unsigned short GetBarsMin() { return bars_min; }
// State checkers.
bool IsLimitGe(ENUM_TRADE_STAT_TYPE _type, ARRAY_REF(unsigned int, _value)) {
Expand Down
22 changes: 15 additions & 7 deletions tests/StrategyTest-RSI.mq5
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,11 @@ class Stg_RSI : public Strategy {
void Stg_RSI(StgParams &_sparams, TradeParams &_tparams, ChartParams &_cparams, string _name = "")
: Strategy(_sparams, _tparams, chart_params_defaults, _name) {}

static Stg_RSI *Init(ENUM_TIMEFRAMES _tf = NULL, long _magic_no = NULL, ENUM_LOG_LEVEL _log_level = V_INFO) {
static Stg_RSI *Init(ENUM_TIMEFRAMES _tf = NULL) {
ChartParams _cparams(_tf);
RSIParams _indi_params(12, PRICE_OPEN, 0);
StgParams _stg_params;
TradeParams _tparams(_magic_no, _log_level);
TradeParams _tparams;
_stg_params.SetIndicator(new Indi_RSI(_indi_params));
Strategy *_strat = new Stg_RSI(_stg_params, _tparams, _cparams, "RSI");
return _strat;
Expand Down Expand Up @@ -73,8 +73,9 @@ Trade *trade;
*/
int OnInit() {
// Initialize strategy instance.
stg_rsi = Stg_RSI::Init(PERIOD_CURRENT, 1234);
stg_rsi = Stg_RSI::Init(PERIOD_CURRENT);
stg_rsi.SetName("Stg_RSI");
stg_rsi.Set<long>(STRAT_PARAM_ID, 1234);

// Initialize trade instance.
ChartParams _cparams((ENUM_TIMEFRAMES)_Period, _Symbol);
Expand Down Expand Up @@ -108,11 +109,15 @@ void OnTick() {
StrategySignal _signal = stg_rsi.ProcessSignals();
if (_signal.CheckSignals(STRAT_SIGNAL_OPEN_BUY)) {
assertTrueOrExit(_signal.GetOpenDirection() == 1, "Wrong order open direction!");
stg_rsi.ExecuteAction(STRAT_ACTION_TRADE_EXE, TRADE_ACTION_ORDER_OPEN, ORDER_TYPE_BUY);
MqlTradeRequest _request =
trade.GetTradeRequest(ORDER_TYPE_BUY, 0, stg_rsi.Get<long>(STRAT_PARAM_ID), stg_rsi.GetName());
trade.RequestSend(_request);
} else if (_signal.CheckSignals(STRAT_SIGNAL_OPEN_SELL)) {
assertTrueOrExit(_signal.GetOpenDirection() == -1, "Wrong order open direction!");
stg_rsi.ExecuteAction(STRAT_ACTION_TRADE_EXE, TRADE_ACTION_ORDER_OPEN, ORDER_TYPE_SELL);
} else {
MqlTradeRequest _request =
trade.GetTradeRequest(ORDER_TYPE_SELL, 0, stg_rsi.Get<long>(STRAT_PARAM_ID), stg_rsi.GetName());
trade.RequestSend(_request);
} else if (trade.Get<bool>(TRADE_STATE_ORDERS_ACTIVE)) {
stg_rsi.ProcessOrders(trade);
stg_rsi.ProcessTasks();
}
Expand All @@ -126,4 +131,7 @@ void OnTick() {
/**
* Implements OnDeinit().
*/
void OnDeinit(const int reason) { delete stg_rsi; delete trade; }
void OnDeinit(const int reason) {
delete stg_rsi;
delete trade;
}

0 comments on commit ce67825

Please sign in to comment.