Adwizard/Experts/Expert.mqh

184 lines
17 KiB
MQL5
Raw Permalink Normal View History

2025-04-11 13:28:40 +03:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| Expert.mq5 |
//| Copyright 2024, Yuriy Bykov |
//| https://www.mql5.com/ru/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Yuriy Bykov"
#property link "https://www.mql5.com/ru/articles/16913"
#property version "1.23"
#include "../Virtual/VirtualAdvisor.mqh"
#include "../Utils/ExpertHistory.mqh"
// A;8 =5 7040=0 :>=AB0=B0 A 8<5=5< 8B>3>2>3> A>25B=8:0, B>
#ifndef __NAME__
// 040Q< 5Q @02=>9 =0720=8N D09;0 A>25B=8:0
#define __NAME__ MQLInfoString(MQL_PROGRAM_NAME)
//+------------------------------------------------------------------+
//| $C=:F8O D>@<8@>20=8O AB@>:8 8=8F80;870F88 AB@0B5388 |
//| 87 2E>4=KE ?0@0<5B@>2 ?> C<>;G0=8N (5A;8 =5 1K;> 7040=> 8<O). |
//| <?>@B8@C5B AB@>:C 8=8F80;870F88 87 107K 40==KE A>25B=8:0 |
//| ?> 845=B8D8:0B>@C 3@C??K AB@0B5389 |
//+------------------------------------------------------------------+
string GetStrategyParams() {
// 5@Q< AB@>:C 8=8F80;870F88 87 =>2>9 181;8>B5:8 4;O 2K1@0==>9 3@C??K
// (87 107K 40==KE M:A?5@B0)
string strategiesParams = CVirtualAdvisor::Import(
CVirtualAdvisor::FileName(__NAME__, magic_),
groupId_
);
// A;8 3@C??0 AB@0B5389 87 181;8>B5:8 =5 7040=0, B> ?@5@K205< @01>BC
if(strategiesParams == NULL && useAutoUpdate_) {
strategiesParams = "";
}
return strategiesParams;
}
#endif
//+------------------------------------------------------------------+
//| E>4=K5 ?0@0<5B@K |
//+------------------------------------------------------------------+
input group "::: A?>;L7>20BL 3@C??C AB@0B5389"
sinput int groupId_ = 0; // - ID 3@C??K 87 =>2>9 181;8>B5:8 (0 - ?>A;54=OO)
sinput bool useAutoUpdate_ = true; // - A?>;L7>20BL 02B>>1=>2;5=85?
input group "::: #?@02;5=85 :0?8B0;><"
sinput double expectedDrawdown_ = 10; // - 0:A8<0;L=K9 @8A: (%)
sinput double fixedBalance_ = 10000; // - A?>;L7C5<K9 45?>78B (0 - 8A?>;L7>20BL 25AL) 2 20;NB5 AG5B0
input double scale_ = 1.00; // - 0AHB018@CNI89 <=>68B5;L 4;O 3@C??K
input group "::: 8A:-<5=5465@"
input bool rmIsActive_ = true; // - :B825=?
input double rmStartBaseBalance_ = 10000; // - 07>2K9 10;0=A
input ENUM_RM_CALC_DAILY_LOSS
rmCalcDailyLossLimit_ = RM_CALC_DAILY_LOSS_MONEY_BB; // - !?>A>1 @0AGQB0 4=52=>3> C1KB:0
input double rmMaxDailyLossLimit_ = 500; // - =0G5=85 4=52=>3> C1KB:0
input double rmCloseDailyPart_ = 1.0; // - =0G5=85 ?>@>3>2>9 G0AB8 4=52=>3> C1KB:0
input ENUM_RM_CALC_OVERALL_LOSS
rmCalcOverallLossLimit_ = RM_CALC_OVERALL_LOSS_MONEY_BB; // - !?>A>1 @0AGQB0 >1I53> C1KB:0
input double rmMaxOverallLossLimit_ = 1000; // - =0G5=85 >1I53> C1KB:0
input double rmCloseOverallPart_ = 1.0; // - =0G5=85 ?>@>3>2>9 G0AB8 >1I53> C1KB:0
input ENUM_RM_CALC_OVERALL_PROFIT
rmCalcOverallProfitLimit_ = RM_CALC_OVERALL_PROFIT_MONEY_BB; // - !?>A>1 @0AGQB0 >1I59 ?@81K;8
input double rmMaxOverallProfitLimit_ = 1000000; // - =0G5=85 >1I59 ?@81K;8
input datetime rmMaxOverallProfitDate_ = 0; // - @545;L=>5 2@5<O >6840=8O >1I59 ?@81K;8 (4=59)
input double rmMaxRestoreTime_ = 0; // - @5<O >6840=8O ;CGH53> 2E>40 =0 ?@>A04:5
input double rmLastVirtualProfitFactor_ = 1; // - =>68B5;L =0G0;L=>9 ;CGH59 ?@>A04:8
input group "::: @>G85 ?0@0<5B@K"
input ulong magic_ = 27183; // - Magic
input bool useOnlyNewBars_ = true; // - 01>B0BL B>;L:> =0 >B:@KB88 10@0
input bool usePrevState_ = true; // - 03@C60BL ?@54K4CI55 A>AB>O=85
input string symbolsReplace_ = ""; // - @028;0 70<5=K A8<2>;>2
CVirtualAdvisor *expert; // 1J5:B M:A?5@B0
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit() {
// #AB0=02;8205< ?0@0<5B@K 2 :;0AA5 C?@02;5=8O :0?8B0;><
CMoney::DepoPart(expectedDrawdown_ / 10.0);
CMoney::FixedBalance(fixedBalance_);
// !B@>:0 8=8F80;870F88 A =01>@0<8 ?0@0<5B@>2 AB@0B5389
string strategiesParams = NULL;
// 5@Q< AB@>:C 8=8F80;870F88 87 =>2>9 181;8>B5:8 4;O 2K1@0==>9 3@C??K
// (87 107K 40==KE M:A?5@B0)
strategiesParams = GetStrategyParams();
// A;8 3@C??0 AB@0B5389 87 181;8>B5:8 =5 7040=0, B> ?@5@K205< @01>BC
if(strategiesParams == NULL) {
return INIT_FAILED;
}
// >43>B02;8205< AB@>:C 8=8F80;870F88 4;O M:A?5@B0 A 3@C??>9 87 =5A:>;L:8E AB@0B5389
string expertParams = StringFormat(
"class CVirtualAdvisor(\n"
" class CVirtualStrategyGroup(\n"
" [\n"
" %s\n"
" ],%f\n"
" ),\n"
" class CVirtualRiskManager(\n"
" %d,%.2f,%d,%.2f,%.2f,%d,%.2f,%.2f,%d,%.2f,%d,%.2f,%.2f"
" )\n"
" ,%d,%s,%d\n"
")",
strategiesParams, scale_,
rmIsActive_, rmStartBaseBalance_,
rmCalcDailyLossLimit_, rmMaxDailyLossLimit_, rmCloseDailyPart_,
rmCalcOverallLossLimit_, rmMaxOverallLossLimit_, rmCloseOverallPart_,
rmCalcOverallProfitLimit_, rmMaxOverallProfitLimit_, rmMaxOverallProfitDate_,
rmMaxRestoreTime_, rmLastVirtualProfitFactor_,
magic_, __NAME__, useOnlyNewBars_
);
PrintFormat(__FUNCTION__" | Expert Params:\n%s", expertParams);
// !>7405< M:A?5@B0, @01>B0NI53> A 28@BC0;L=K<8 ?>78F8O<8
expert = NEW(expertParams);
// A;8 M:A?5@B =5 A>740=, B> 2>72@0I05< >H81:C
if(!expert) return INIT_FAILED;
// A;8 ?@8 70<5=5 A8<2>;>2 2>7=8:;0 >H81:0, B> 2>72@0I05< >H81:C
if(!expert.SymbolsReplace(symbolsReplace_)) return INIT_FAILED;
// A;8 B@51C5BAO 2>AAB0=02;820BL A>AB>O=85, B>
if(usePrevState_) {
// 03@C605< ?@>H;>5 A>AB>O=85 ?@8 =0;8G88
if(!expert.Load()) return INIT_FAILED;
//expert.Tick();
}
// #A?5H=0O 8=8F80;870F8O
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick() {
expert.Tick();
// A;8 >4=>2@5<5==> 2K?>;=5=>:
if(groupId_ == 0 // - =5 7040= :>=:@5B=K9 845=B8D8:0B>@ 3@C??K
&& useAutoUpdate_ // - @07@5H5=> 02B>>1=>2;5=85
&& IsNewBar(Symbol(), PERIOD_D1) // - =0ABC?8; =>2K9 45=L
&& expert.CheckUpdate() // - >1=0@C65=0 =>20O 3@C??0 AB@0B5389
) {
// !>E@0=O5< B5:CI55 A>AB>O=85 M:A?5@B0
expert.Save();
// #40;O5< >1J5:B M:A?5@B0
delete expert;
// K7K205< DC=:F8N 8=8F80;870F88 A>25B=8:0 4;O 703@C7:8 =>2>9 3@C??K AB@0B5389
OnInit();
}
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
if(!!expert) delete expert;
}
//+------------------------------------------------------------------+
//| 57C;LB0B B5AB8@>20=8O |
//+------------------------------------------------------------------+
double OnTester(void) {
CExpertHistory::Export();
return expert.Tester();
}
//+------------------------------------------------------------------+