UP. J'aimerais connaître le principe de la conversion d'un EA en script en quelques mots.
Et que va faire le scénario ?
Habituellement, le terminal est débranché, un fichier CSV est écrit à partir d'une période non standard et ensuite chargé à la place de n'importe quel symbole et période, sur cette période et testé. Vrai au prix d'ouverture, mais il n'y a pas beaucoup d'autres options.
Habituellement, le terminal est débranché, un fichier CSV est écrit à partir d'une période non standard et ensuite chargé à la place d'un symbole et d'une période, c'est la période sur laquelle les tests sont effectués. Vrai au prix d'ouverture, mais il n'y a pas beaucoup d'autres options.
Merci à tous ceux qui ont répondu. J'aime la variante avec la substitution TF, je vais l'essayer. J'avais initialement prévu d'ouvrir un standalone TF non standard et de décharger les transactions dans un fichier en utilisant un script Expert Advisor.
J'ai commencé à comprendre votre code. Je suis surpris. Ce que vous avez joint ne peut pas fonctionner. Vous pouvez voir qu'elle est composée de morceaux, mais au moins les supports sont corrects.
Le code est en deux parties. C'est mon expert. Veuillez y jeter un coup d'œil.
//+------------------------------------------------------------------+//| rusa_v4.mq4 |//| //| |//+------------------------------------------------------------------+#property copyright ""#property link "https://www.mql5.com/ru/users/avoitenko"//--- Внешние переменные externstring General = "=== General settings ===";
externint TakeProfit_Buy = 260; // Тейк профит для Buyexternint StopLoss_Buy = 120; // Стоп лосс для Buyexternint TakeProfit_Sell = 140; // Тейк профит для Sellexternint StopLoss_Sell = 110; // Стоп лосс для Sellexternint TrailingStop = 0; // Трейлинг стопexterndouble Lots = 0.02; // Лот externint Slippage = 10; // Проскальзываниеexternint BarsShift = 0; // Смещение в барах для анализа сигналаexternint Magic = 555; // Уникальный номер советникаexternstring MA1 = "=== #1 Moving Average settings ===";
externint MA1_period = 15; // Период скользящей средней externint MA1_shift = 0; // Смещение скользящей средней externint MA1_method = 1; // MODE_SMA=0,MODE_EMA=1,MODE_SMMA=2,MODE_LWMA =3;externint MA1_price = 2; // PRICE_CLOSE=0,PRICE_OPEN=1,PRICE_HIGH=2,PRICE_LOW=3,PRICE_MEDIAN=4,PRICE_TYPICAL=5,PRICE_WEIGHTED=6;externstring MA2 = "=== #2 Moving Average settings ===";
externint MA2_period = 20;
externint MA2_shift = 0;
externint MA2_method = 0;
externint MA2_price = 0;
externstring MA3 = "=== #3 Moving Average settings ===";
externint MA3_period = 70;
externint MA3_shift = 8;
externint MA3_method = 2;
externint MA3_price = 3;
externstring RSI = "=== RSI settings ===";
externint RSI_period = 14; // Период RSIexternint RSI_price = 3; // PRICE_CLOSE=0,PRICE_OPEN=1,PRICE_HIGH=2,PRICE_LOW=3,PRICE_MEDIAN=4,PRICE_TYPICAL=5,PRICE_WEIGHTED=6;externint macd_fast = 12;
externint macd_slow = 15;
externint macd_signal = 1;
externint macd_price = 3; // 0-PRICE_CLOSE, 1-PRICE_OPEN, 2-PRICE_HIGH, 3-PRICE_LOW, 4-PRICE_MEDIAN, 5-PRICE_TYPICAL, 6-PRICE_WEIGHTEDexternint macd_open = 7;
//--- Глобальные переменныеdouble lot; // лотdouble ma10,ma20,ma30,ma11,ma21,ma31,rsi, macd;
int stop_loss_buy; // стоп лоссint take_profit_buy; // тейк профитint stop_loss_sell; // стоп лоссint take_profit_sell; // тейк профитint slippage; // проскальзываниеint trailing_stop; // трейлинг стопint min_level; // минимальный отступ от цены для установки SL / TPint bars_shift; // смещение в барах для торговых сигналовint bars_count; // минимальное число баров для работыdatetime candle_time = 0;
bool sell_open = false; // флаг открытия позиции sellbool buy_open = false; // флаг открытия позиции buybool new_bar_buy = false; // флаг нового бараbool new_bar_sell = false; // флаг нового бара//+------------------------------------------------------------------+int init()
//+------------------------------------------------------------------+
{
//--- проверка правильности ввода данных
bars_shift = BarsShift;
if(bars_shift < 0)bars_shift = 0;
bars_count = MathMax4(MA1_period, MA2_period, MA3_period, RSI_period) + bars_shift;
//--- инициализация переменных
stop_loss_buy = StopLoss_Buy;
take_profit_buy = TakeProfit_Buy;
stop_loss_sell = StopLoss_Sell;
take_profit_sell = TakeProfit_Sell;
slippage = Slippage;
trailing_stop = TrailingStop;
//--- Если цена состоит из 3-x / 5-и цифрif((Digits==3) || (Digits==5))
{
stop_loss_buy = stop_loss_buy * 10;
take_profit_buy = take_profit_buy * 10;
stop_loss_sell = stop_loss_sell * 10;
take_profit_sell = take_profit_sell * 10;
slippage = slippage * 10;
trailing_stop = trailing_stop * 10;
}
Print("Советник начал свою работу");
return(0);
}
bool macd_up(int timeframe, int fast, int slow, int signal, int price, int num) {
double y;
double x = iMACD(NULL,timeframe,fast,slow,signal,price,MODE_MAIN,0)*100000;
for (int i=1; i<num; i++) {
y = iMACD(NULL,timeframe,fast,slow,signal,price,MODE_MAIN,i)*100000;
if (y > x) return(false);
else x = y;
}
return(true);
}
//+------------------------------------------------------------------+bool macd_down(int timeframe, int fast, int slow, int signal, int price, int num) {
double y;
double x = iMACD(NULL,timeframe,fast,slow,signal,price,MODE_MAIN,0)*100000;
for (int i=1; i<num; i++) {
y = iMACD(NULL,timeframe,fast,slow,signal,price,MODE_MAIN,i)*100000;
if (y < x) return(false);
else x = y;
}
return(true);
}
//+------------------------------------------------------------------+int deinit()
//+------------------------------------------------------------------+
{
Print("Советник завершил свою работу");
return(0);
}
//+------------------------------------------------------------------+int start()
//+------------------------------------------------------------------+
{
//--- Разрешение на открытие позиций - каждую свечуif(candle_time != Time[0])
{
candle_time = Time[0];
new_bar_buy = true;
new_bar_sell = true;
}
if (Bars < bars_count){Print("Мало данных для работы"); return(0);}
//--- Получение значений индикатора iMA
ma10 = iMA ( Symbol(), Period(), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift);
ma20 = iMA ( Symbol(), Period(), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift);
ma30 = iMA ( Symbol(), Period(), MA3_period, MA3_shift, MA3_method, MA3_price, bars_shift);
ma11 = iMA ( Symbol(), Period(), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift+1);
ma21 = iMA ( Symbol(), Period(), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift+1);
rsi = iRSI ( Symbol(), Period(), RSI_period, RSI_price, bars_shift);
macd = iMACD(NULL,0,macd_fast,macd_slow,macd_signal,macd_price,MODE_MAIN,0);
{
if (macd <0)
{
if (macd_down(0,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return(true);
{
//--- Условие для продажиif(ma11 < ma21 && ma10 > ma20 && ma30 > ma10 && rsi<50 && new_bar_sell)
{
sell_open=true;
new_bar_sell = false;
}
}
}
}
{
if (macd > 0)
{
if (macd_up(0,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return(true);
{
//--- Условие для продажиif(ma11 > ma21 && ma10 < ma20 && ma30 < ma10 && rsi>50 && new_bar_buy)
{
buy_open=true;
new_bar_buy = false;
}
}
}
}
{
if (macd > 0)
{
if (macd_up(0,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return(true);
{
//--- Условие для покупкиif(ma11 < ma21 && ma10 > ma20 && ma30 > ma10 && rsi>50 && new_bar_buy)
{
buy_open=true;
new_bar_buy = false;
}
}
}
{
if (macd < 0)
{
if (macd_down(0,macd_fast,macd_slow,macd_signal,macd_price,macd_open)) return(true);
{ //--- Условие для продажиif(ma11 > ma21 && ma10 < ma20 && ma30 < ma10 && rsi<50 && new_bar_sell)
{
sell_open=true;
new_bar_sell = false;
}
}
}
}
}
//--- выставление рыночных ордеровif(IsTradeAllowed())
{
Trade_BUY();
Trade_SELL();
}
return(0);
}
Exécution de l'EA sur le testeur. Le serveur est composé de quatre chiffres. Lorsque l'on passe un ordre d'achat ou de vente dans le journal, on peut lire ceci
Mais s'ouvre à 1.55512 ! Aux cinq chiffres. Ensuite, les ordres en attente sont placés à quatre chiffres et déclenchés à quatre chiffres également. Mais OP_SELL et OP_BUY ne s'ouvrent que par cinq chiffres !
Je fais NormalizeDouble(Ask,Digits) ;
Rien ne marche ! Veuillez me conseiller sur la façon de résoudre ce problème.
Vous pouvez, bien sûr, ignorer le dernier chiffre. L'erreur ne se produit pas, mais pour la pureté de l'expérience, j'ai besoin que toutes mes transactions soient effectuées en quatre chiffres.
Il est fort probable que votre MT4 et votre serveur aient une cotation à cinq chiffres, comme le mien. Ainsi, tout doit être multiplié par 10, car chiffres = 5.
UP. le principe de la conversion d'un EA en script en quelques mots serait apprécié.
UP. le principe de la conversion d'un EA en script en quelques mots serait apprécié.
Je ne sais pas exactement, mais il semble que si vous déplacez l'EA vers les scripts, il fonctionnera comme un script.
UP. J'aimerais connaître le principe de la conversion d'un EA en script en quelques mots.
Et que va faire le scénario ?
Habituellement, le terminal est débranché, un fichier CSV est écrit à partir d'une période non standard et ensuite chargé à la place de n'importe quel symbole et période, sur cette période et testé. Vrai au prix d'ouverture, mais il n'y a pas beaucoup d'autres options.
Et que va faire le scénario ?
Habituellement, le terminal est débranché, un fichier CSV est écrit à partir d'une période non standard et ensuite chargé à la place d'un symbole et d'une période, c'est la période sur laquelle les tests sont effectués. Vrai au prix d'ouverture, mais il n'y a pas beaucoup d'autres options.
Merci à tous ceux qui ont répondu. J'aime la variante avec la substitution TF, je vais l'essayer. J'avais initialement prévu d'ouvrir un standalone TF non standard et de décharger les transactions dans un fichier en utilisant un script Expert Advisor.
Ce qui est :
Maximum drawdown, % - pourcentage maximum de drawdown ;
Vous pouvez spécifier un tel paramètre dans l'optimiseur de stratégie, mais sa signification n'est pas claire...
1) S'agit-il de la diminution maximale du solde par rapport au dépôt initial ?
2) Différence maximale entre le maximum et le minimum de l'équité qui se suivent ?
3) La différence entre la marge minimale et la marge maximale ?
De nombreuses autres variantes me viennent à l'esprit.
Veuillez expliquer la signification exacte de (Maximum drawdown, %)
J'ai commencé à comprendre votre code. Je suis surpris. Ce que vous avez joint ne peut pas fonctionner. Vous pouvez voir qu'elle est composée de morceaux, mais au moins les supports sont corrects.
Le code est en deux parties. C'est mon expert. Veuillez y jeter un coup d'œil.
deuxième partie
Bonjour !
Exécution de l'EA sur le testeur. Le serveur est composé de quatre chiffres. Lorsque l'on passe un ordre d'achat ou de vente dans le journal, on peut lire ceci
2011.10.23 15:27:26 2010.12.16 06:16 test_sovetnik GBPUSD,H1 : ouvert #1 acheter 0.10 GBPUSD à 1.5551 sl : 1.4551 tp : 1.5586 ok
Mais s'ouvre à 1.55512 ! Aux cinq chiffres. Ensuite, les ordres en attente sont placés à quatre chiffres et déclenchés à quatre chiffres également. Mais OP_SELL et OP_BUY ne s'ouvrent que par cinq chiffres !
Je fais NormalizeDouble(Ask,Digits) ;
Rien ne marche ! Veuillez me conseiller sur la façon de résoudre ce problème.
Vous pouvez, bien sûr, ignorer le dernier chiffre. L'erreur ne se produit pas, mais pour la pureté de l'expérience, j'ai besoin que toutes mes transactions soient effectuées en quatre chiffres.
Il est fort probable que votre MT4 et votre serveur aient une cotation à cinq chiffres, comme le mien. Ainsi, tout doit être multiplié par 10, car chiffres = 5.
Comment supprimer un ordre en attente si l'un d'eux s'est déclenché ? Il y a deux ordres en attente au total.
Vous pouvez le faire manuellement. Cliquez avec le bouton droit de la souris et ensuite... :)
Vous pouvez appliquer un script ou un conseiller expert. Lequel préférez-vous ? XD