Comment puis-je connaître le type de paramètre d'entrée ?
le compilateur substitue lui-même les types au moment de l'appel de la fonction template, si cet appel n'était pas encore dans le code, alors le compilateur va créer une autre copie de la fonction et définir les types lui-même - bien, comme si c'était logique - un template
si la question est de savoir comment définir le type dans une telle fonction, utilisez
typename
UPD : ajout à l'exemple ci-dessus du paramètre type imprimantes :
Après-midi. Je suis confronté à un phénomène étrange lors de l'écriture d'un indicateur dans MQL5 (indicateur dans une sous-fenêtre séparée, 4 lignes).
Les descriptions des tampons initiaux sont les suivantes :
//--- buffers (массивы под буферы индикатора)//--------------------------------------------------------------------double RSI[]; // буфер под RSI//--------------------------------------------------------------------double MAr1_fast[]; // буфер под быструю МАdouble MAr2_slow[]; // буфер под медленную МАdouble MAr2_slowColor[]; // буфер под цвета медленной МА//--------------------------------------------------------------------double MAr3_slow_glob[]; // буфер под глобальную медленную МАdouble MAr3_slow_globColor[]; // буфер под цвета глобальной медленной МА//--------------------------------------------------------------------
En gros, l'indicateur trace 4 lignes : les deux premières sont unicolores, les deux suivantes sont bicolores (elles changent de couleur sur les nœuds).
Le bicolore est dû à la manière de dessiner DRAW_COLOR_LINE.
Question : la première ligne (tampons 2 et 3 dans le code ci-dessus) est parfaitement dessinée et tout le code écrit pour elle dans OnInit fonctionne ; la deuxième ligne apparaît pour une raison quelconque, par exemple la ligne ne fonctionne pas :
PlotIndexSetString (4, PLOT_LABEL, "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
C'est-à-dire qu'au lieu du texte que j'ai défini dans la fenêtre de données, seul le nom de l'indicateur est affiché à la place du tampon. Bien que la ligne elle-même soit tracée, et qu'elle soit, comme il se doit, multicolore. Je pense que le truc est dans le changement de numérotation ? Par exemple, je ne sais pas pourquoi dans la partie supérieure du code, lorsque je déclare la dernière ligne avec la directive #property, l'index devrait être 4 et non 5, car 4 tampons ont déjà été utilisés auparavant. Y a-t-il une quelconque relation entre la numérotation des lignes lors de la déclaration avec #property et la numérotation des tampons lors de la liaison avec des tableaux dans OnInit ?
Veuillez me dire ce qui ne va pas dans le code ci-dessus. Peut-être que quelqu'un peut trouver un exemple d'indicateur où au moins deux lignes sont dessinées en utilisant la méthode de dessin DRAW_COLOR_LINE.... .
Une autre question connexe : comment les tampons de ligne colorés sont-ils reliés entre eux ? Je veux dire, comment le code compilé sait-il que si je mets une valeur dans un tampon de couleur, cette couleur doit être utilisée pour colorer une ligne d'un autre tampon ?
Après-midi. Je suis confronté à un phénomène étrange lors de l'écriture d'un indicateur dans MQL5 (indicateur dans une sous-fenêtre séparée, 4 lignes).
Les descriptions des tampons initiaux sont les suivantes :
Suivant dans OnInit :
En gros, l'indicateur trace 4 lignes : les deux premières sont unicolores, les deux suivantes sont bicolores (elles changent de couleur sur les nœuds).
Le bicolore est dû à la façon de dessiner DRAW_COLOR_LINE.
Question : la première ligne (tampons 2 et 3 dans le code ci-dessus) est parfaitement dessinée et tout le code écrit pour elle dans OnInit fonctionne ; la deuxième ligne apparaît pour une raison quelconque, par exemple la ligne ne fonctionne pas :
C'est-à-dire qu'au lieu du texte que j'ai défini dans la fenêtre de données, seul le nom de l'indicateur est affiché à la place du tampon. Bien que la ligne elle-même soit tracée, et qu'elle soit, comme il se doit, multicolore. Je pense que le truc est dans le changement de numérotation ? Par exemple, je ne sais pas pourquoi dans la partie supérieure du code, lorsque je déclare la dernière ligne avec la directive #property, l'index devrait être 4 et non 5, car 4 tampons ont déjà été utilisés auparavant. Y a-t-il une quelconque relation entre la numérotation des lignes lors de la déclaration avec #property et la numérotation des tampons lors de la liaison avec des tableaux dans OnInit ?
Veuillez me dire ce qui ne va pas dans le code ci-dessus. Peut-être que quelqu'un peut trouver un exemple d'indicateur où au moins deux lignes sont dessinées en utilisant la méthode de dessin DRAW_COLOR_LINE.... .
Une autre question connexe : comment les tampons de ligne colorés sont-ils reliés entre eux ? Je veux dire, comment le code compilé sait-il que si je mets une valeur dans un tampon de couleur, cette couleur doit être utilisée pour colorer une ligne d'un autre tampon ?
Les mappings sont numérotés différemment des tampons.
PlotIndexSetString (3, PLOT_LABEL, "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Bonne journée. Je veux écrire un EA basé sur la mesure de l'angle de pente d'une moyenne mobile (ou mieux un ensemble d'entre elles, à savoir l'Alligator), de sorte que l'EA donne une alerte sur une forte impulsion de prix, de préférence avec un petit décalage. Veuillez indiquer comment mesurer l'angle de la MA ou "dire à l'EA" que l'impulsion s'est produite. Peut-être existe-t-il déjà des moyens connus de le faire. Ou par exemple un indicateur gratuit basé sur le calcul des impulsions ?
J'ai écrit une fonction pour trouver le numéro de barre d'une fractale à partir de 3 barres. Sur le tableau en ligne, il semble le trouver correctement. Mais pendant le test visuel dans le testeur, il ment. L'un des professionnels peut-il jeter un coup d'œil au code et trouver des erreurs ?
Je vous en serais très reconnaissant.
//+----------------------------------------------------------------------------+//| Описание : Возвращает номер бара трёхбарного фарактала по его номеру. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий ТФ) |//| nf - номер экстремума ( 0 - последний) |//+----------------------------------------------------------------------------+int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
if(sy=="" || sy=="0") sy=Symbol();
int nlext=0,k=iBars(sy,tf);
nlext=0;
if(mode==MODE_UPPER)
{
for (int i=2; i<=k; i++)
{
if(High[i]>High[i+1] && High[i]>High[i-1])
{
nlext++;
if(nlext>ne) return(i);
}
}
}
if(mode==MODE_LOWER)
{
for (i=2; i<=k; i++)
{
if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
{
nlext++;
if(nlext>ne)
{
//Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);return(i);
}
}
}
}
Print("Бар локального экстремума не найден");
return(-1);
}
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
Bon après-midi. QUEL CODE DOIS-JE AJOUTER POUR QUE L'INDICATEUR CESSE DE FONCTIONNER DANS LE TESTEUR APRÈS UN MOIS ? C'EST-À-DIRE QUE J'AI ÉCRIT TOUT CE QUI EST CORRECT ! MAIS LORSQUE JE FAIS UN BACKTEST, CELA FONCTIONNE À NOUVEAU. (mgl4)
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
datetime data=D'2020.09.16 20:07'; // Time Blockif(TimeCurrent()>data)
{
Print("Демонстрационный период закончился, покупайте индикатор :)");
Alert("Демонстрационный период закончился, покупайте индикатор :)");
return(INIT_FAILED);
}
if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
Comment("Демонстрационный период закончился, покупайте индикатор :) Демонстрационный период закончился, покупайте индикатор :) Демонстрационный период закончился, покупайте индикатор :)");
return(0);
}
Je voulais mettre une condition dans le cycle de clôture des ordres lejour de l'ouverture des ordres, afin que ceux qui ont été ouverts le vendredi ne soient pas fermés.
while (OrdersTotal()>0)
{
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
{
if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5))
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if(result!=TRUE) { error=GetLastError();
Print("LastError = ",error, " ",Symbol()); }
else error=0;
}
elsePrint("NoMagic ", OrderMagicNumber()); // for Debug
}
elsePrint( "Error when order select ", GetLastError());
}
Bon après-midi. QUEL CODE DOIS-JE AJOUTER POUR QUE L'INDICATEUR CESSE DE FONCTIONNER DANS LE TESTEUR APRÈS UN MOIS ? C'EST-À-DIRE QUE J'AI ÉCRIT TOUT CE QUI EST CORRECT ! MAIS LORSQUE JE FAIS UN BACKTEST, CELA FONCTIONNE À NOUVEAU. (mgl4)
Vous devez écrire ce code non pas dans OnInit, mais dans OnTick().
Je voulais mettre une condition dans le cycle de clôture des ordres lejour de l'ouverture des ordres, afin que ceux ouverts le vendredi ne soient pas clôturés.
Essayez de cette façon :
for(int is=OrdersTotal()-1; is>=0; is--)
{
if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))
{
if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5))
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if(result!=TRUE) { error=GetLastError();
Print("LastError = ",error, " ",Symbol()); }
else error=0;
}
else Print("NoMagic ", OrderMagicNumber()); // for Debug
}
else Print( "Error when order select ", GetLastError());
}
Comment puis-je connaître le type de paramètre d'entrée ?
le compilateur substitue lui-même les types au moment de l'appel de la fonction template, si cet appel n'était pas encore dans le code, alors le compilateur va créer une autre copie de la fonction et définir les types lui-même - bien, comme si c'était logique - un template
si la question est de savoir comment définir le type dans une telle fonction, utilisez
typenameUPD : ajout à l'exemple ci-dessus du paramètre type imprimantes :
2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)
2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, typename = int
2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, typename = int
2020.09.16 18:58:21.681 tst (EURUSD,M5) 5
2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)
2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, typename = double
2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, typename = double
2020.09.16 18:58:21.681 tst (EURUSD,M5) 40
UPD : ajout de__FUNCSIG__ à cet exemple
Après-midi.
Je suis confronté à un phénomène étrange lors de l'écriture d'un indicateur dans MQL5 (indicateur dans une sous-fenêtre séparée, 4 lignes).
Les descriptions des tampons initiaux sont les suivantes :
Suivant dans OnInit :
En gros, l'indicateur trace 4 lignes : les deux premières sont unicolores, les deux suivantes sont bicolores (elles changent de couleur sur les nœuds).
Le bicolore est dû à la manière de dessiner DRAW_COLOR_LINE.
Question : la première ligne (tampons 2 et 3 dans le code ci-dessus) est parfaitement dessinée et tout le code écrit pour elle dans OnInit fonctionne ;
C'est-à-dire qu'au lieu du texte que j'ai défini dans la fenêtre de données, seul le nom de l'indicateur est affiché à la place du tampon. Bien que la ligne elle-même soit tracée, et qu'elle soit, comme il se doit, multicolore.la deuxième ligne apparaît pour une raison quelconque, par exemple la ligne ne fonctionne pas :
Je pense que le truc est dans le changement de numérotation ? Par exemple, je ne sais pas pourquoi dans la partie supérieure du code, lorsque je déclare la dernière ligne avec la directive #property, l'index devrait être 4 et non 5, car 4 tampons ont déjà été utilisés auparavant. Y a-t-il une quelconque relation entre la numérotation des lignes lors de la déclaration avec #property et la numérotation des tampons lors de la liaison avec des tableaux dans OnInit ?
Veuillez me dire ce qui ne va pas dans le code ci-dessus. Peut-être que quelqu'un peut trouver un exemple d'indicateur où au moins deux lignes sont dessinées en utilisant la méthode de dessin DRAW_COLOR_LINE....
.
Une autre question connexe : comment les tampons de ligne colorés sont-ils reliés entre eux ? Je veux dire, comment le code compilé sait-il que si je mets une valeur dans un tampon de couleur, cette couleur doit être utilisée pour colorer une ligne d'un autre tampon ?
Après-midi.
Je suis confronté à un phénomène étrange lors de l'écriture d'un indicateur dans MQL5 (indicateur dans une sous-fenêtre séparée, 4 lignes).
Les descriptions des tampons initiaux sont les suivantes :
Suivant dans OnInit :
En gros, l'indicateur trace 4 lignes : les deux premières sont unicolores, les deux suivantes sont bicolores (elles changent de couleur sur les nœuds).
Le bicolore est dû à la façon de dessiner DRAW_COLOR_LINE.
Question : la première ligne (tampons 2 et 3 dans le code ci-dessus) est parfaitement dessinée et tout le code écrit pour elle dans OnInit fonctionne ;
C'est-à-dire qu'au lieu du texte que j'ai défini dans la fenêtre de données, seul le nom de l'indicateur est affiché à la place du tampon. Bien que la ligne elle-même soit tracée, et qu'elle soit, comme il se doit, multicolore.la deuxième ligne apparaît pour une raison quelconque, par exemple la ligne ne fonctionne pas :
Je pense que le truc est dans le changement de numérotation ? Par exemple, je ne sais pas pourquoi dans la partie supérieure du code, lorsque je déclare la dernière ligne avec la directive #property, l'index devrait être 4 et non 5, car 4 tampons ont déjà été utilisés auparavant. Y a-t-il une quelconque relation entre la numérotation des lignes lors de la déclaration avec #property et la numérotation des tampons lors de la liaison avec des tableaux dans OnInit ?
Veuillez me dire ce qui ne va pas dans le code ci-dessus. Peut-être que quelqu'un peut trouver un exemple d'indicateur où au moins deux lignes sont dessinées en utilisant la méthode de dessin DRAW_COLOR_LINE....
.
Une autre question connexe : comment les tampons de ligne colorés sont-ils reliés entre eux ? Je veux dire, comment le code compilé sait-il que si je mets une valeur dans un tampon de couleur, cette couleur doit être utilisée pour colorer une ligne d'un autre tampon ?
Les mappings sont numérotés différemment des tampons.
Cela devrait fonctionner.
Bonjour à tous !
J'ai créé une fonction pour modifier le stoploss. Mais quand il fonctionne, il donne EURUSD,H1 : OrderModify error 130.
Et le prix est loin de l'endroit où le stoploss devrait être fixé.
Voici la fonction :
void open_bu(string walpa, int op) { bool err; int spred=(int)MarketInfo(walpa,MODE_SPREAD); double point=MarketInfo(walpa,MODE_POINT); int digits=(int)MarketInfo(walpa,MODE_DIGITS); for(int is=OrdersTotal()-1; is>=0; is--) { if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa) { if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) ) { err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE); if(!err) error(GetLastError()); } if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0)) { Print(walpa," ",spred," ",point," ",digits," ",NormalizeDouble(OrderOpenPrice()-spred*point, digits)); err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE); if(!err) error(GetLastError()); } } } return; }J'ai écrit une fonction pour trouver le numéro de barre d'une fractale à partir de 3 barres. Sur le tableau en ligne, il semble le trouver correctement. Mais pendant le test visuel dans le testeur, il ment. L'un des professionnels peut-il jeter un coup d'œil au code et trouver des erreurs ?
Je vous en serais très reconnaissant.
Bon après-midi. QUEL CODE DOIS-JE AJOUTER POUR QUE L'INDICATEUR CESSE DE FONCTIONNER DANS LE TESTEUR APRÈS UN MOIS ? C'EST-À-DIRE QUE J'AI ÉCRIT TOUT CE QUI EST CORRECT ! MAIS LORSQUE JE FAIS UN BACKTEST, CELA FONCTIONNE À NOUVEAU. (mgl4)
Bonjour !
Je voulais mettre une condition dans le cycle de clôture des ordres lejour de l'ouverture des ordres, afin que ceux qui ont été ouverts le vendredi ne soient pas fermés.
Bon après-midi. QUEL CODE DOIS-JE AJOUTER POUR QUE L'INDICATEUR CESSE DE FONCTIONNER DANS LE TESTEUR APRÈS UN MOIS ? C'EST-À-DIRE QUE J'AI ÉCRIT TOUT CE QUI EST CORRECT ! MAIS LORSQUE JE FAIS UN BACKTEST, CELA FONCTIONNE À NOUVEAU. (mgl4)
Vous devez écrire ce code non pas dans OnInit, mais dans OnTick().
Bonjour !
Je voulais mettre une condition dans le cycle de clôture des ordres lejour de l'ouverture des ordres, afin que ceux ouverts le vendredi ne soient pas clôturés.
Essayez de cette façon :
for(int is=OrdersTotal()-1; is>=0; is--) { if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES)) { if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) { if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error, " ",Symbol()); } else error=0; } else Print("NoMagic ", OrderMagicNumber()); // for Debug } else Print( "Error when order select ", GetLastError()); }