Pourquoi isCrossing() ne renvoie pas 2? ?? La fonction isCrossing() elle-même a une deuxième entrée if, mais il n'y a pas d'entrée if dans OnTick() lorsque isCrossing() == 2. Quelle absurdité...
Les deux conditions sont remplies... donc vous obtenez le premier résultat.
Pourquoi isCrossing() ne renvoie pas 2? ?? La fonction isCrossing() elle-même a une deuxième entrée if, mais il n'y a pas d'entrée if dans OnTick() lorsque isCrossing() == 2. Quelle absurdité...
Pour une raison quelconque, je ne pense pas qu'il renvoie 1 non plus.
Cette condition
if(g_barTime < iTime(NULL,g_timeFrame,0)// и дальше
Indique qu'une nouvelle barre a été ouverte. Au premier tick de la barre, open == high == low == close et == Bid - d'où la condition
&& high > ma && Bid <= ma)
ou
&& low < ma && Bid >= ma)
ne peuvent être remplies...
Une question a été posée aujourd'hui sur la condition if(i != i) Ces conditions sont approximativement les mêmes.
"1" retourne, a fait le débogage du code dans MetaEditor.
De plus, même si tout est égal, ce n'est que sur le premier tick.
Cela fonctionne comme suit
//--- input parametersinputint g_maPeriod = 14;
inputint g_maShift = 1;
inputENUM_APPLIED_PRICE g_maPrice = PRICE_CLOSE; //Applied priceinputENUM_MA_METHOD g_maMethod = MODE_SMA; //Method MainputENUM_TIMEFRAMES g_timeFrame = PERIOD_CURRENT; //Timeframe for calculatedatetime g_barTime=0;
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---if(g_barTime != iTime(NULL,g_timeFrame,0))
{
if(isCrossing()==1)
{
Print("enter to '1. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
}
if(isCrossing()==2)
{
Print("enter to '2. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
}
}
}
//+------------------------------------------------------------------+int isCrossing()
{
int res=0;
double low = iLow(Symbol(), g_timeFrame, 1);
double high = iHigh(Symbol(), g_timeFrame, 1);
double ma = iMA(_Symbol, g_timeFrame, g_maPeriod, g_maShift, g_maMethod, g_maPrice, 0);
if(high > ma && Bid <= ma) res=1;
if(low < ma && Bid >= ma) res=2;
return (res);
}
//+------------------------------------------------------------------+
2021.08.2509:24:56.6292021.08.2023:50:00 Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.2509:24:56.6242021.08.2023:45:00 Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.2509:24:56.5922021.08.2021:35:00 Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.2509:24:56.5822021.08.2021:05:00 Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.2509:24:56.5662021.08.2020:20:00 Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.2509:24:56.5542021.08.2018:50:00 Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.2509:24:56.5532021.08.2018:45:00 Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.2509:24:56.5532021.08.2018:40:00 Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
Je l'ai donc laissé tel quel, sauf que maintenant tout ce qui vient de isCrossing() est renvoyé à la variable. Rien ne fait double emploi et tout fonctionne. Merci à tous :)
2021.08.2509:24:56.6292021.08.2023:50:00 Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.2509:24:56.6242021.08.2023:45:00 Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.2509:24:56.5922021.08.2021:35:00 Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.2509:24:56.5822021.08.2021:05:00 Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.2509:24:56.5662021.08.2020:20:00 Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.2509:24:56.5542021.08.2018:50:00 Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.2509:24:56.5532021.08.2018:45:00 Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.2509:24:56.5532021.08.2018:40:00 Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
Je vois maintenant que vous avez ajouté un journal. Ici aussi, vous avez des messages en double :)
Les deux conditions sont remplies... donc vous obtenez le premier résultat.
Les deux conditions sont remplies... donc vous obtenez le premier résultat.
Pour une raison quelconque, je ne pense pas qu'il renvoie 1 non plus.
Cette condition
Indique qu'une nouvelle barre a été ouverte. Au premier tick de la barre, open == high == low == close et == Bid - d'où la condition
ou
ne peuvent être remplies...Une question a été posée aujourd'hui sur la condition if(i != i) Ces conditions sont approximativement les mêmes.
P.S.
avec la fonction isCrossing() a laissé tout en l'état.
Pour une raison quelconque, je ne pense pas qu'il renvoie 1 non plus.
Cette condition
raconte l'ouverture d'un nouveau bar. Au premier tick de la barre, open == high == low == close et == Bid - d'où la condition suivante
ou
ne peuvent être remplies...Il y avait une question aujourd'hui sur la condition if(i != i) Ces conditions sont à peu près les mêmes.
"1" retourne, a fait le débogage du code dans MetaEditor.
De plus, même si tout est égal, ce n'est que sur le premier tick.
"1" retourne, a fait le débogage du code dans MetaEditor.
De plus, même si tout est égal, ce n'est que sur le premier tick.
Eh bien, oui, j'avais tort. Le nouveau bar ne sera mis en place qu'après avoir rempli toutes les conditions.
Essayez de remplacer high et low par open. Peut-être que cela n'affectera pas trop la stratégie.
"1" retourne, a fait le débogage du code dans MetaEditor.
De plus, même si tout est égal, ce n'est que sur le premier tick.
Cela fonctionne comme suit
Cela fonctionne comme suit.
J'ai fait cela et tout fonctionne, seuls les messages de isCrossing() sont dupliqués, car le f-e est appelé deux fois pour un tick.
Je l'ai donc laissé tel quel, sauf que maintenant tout ce qui vient de isCrossing() est renvoyé à la variable. Rien ne fait double emploi et tout fonctionne. Merci à tous :)
pouvez-vous expliquer la différence entre les fonctions ?
for (int j = OrdersHistoryTotal()-1 ; j >= 0 ; j--)
{
if(OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
и
int i=OrdersHistoryTotal() ;
for(int pos=0 ; pos<i ; pos++)
{
if(OrderSelect(pos, SELECT_BY_POS,MODE_HISTORY))