Merci beaucoup, Sergei ! Si je comprends bien : Dans le premier cas, un tableau de variables statiques est créé, chacune pour son propre symbole avec un délai fixe, c'est-à-dire qu'aucun autre délai ne peut être utilisé pour ce symbole ; Dans le second cas, une classe pour chaque combinaison symbole + période.
MikeZv: Merci beaucoup, Sergei ! Si je comprends bien : Dans le premier cas, un tableau de variables statiques est créé, chacune pour son propre symbole avec un délai fixe, c'est-à-dire qu'aucun autre délai ne peut être utilisé pour ce symbole ; Dans le second cas, une classe pour chaque combinaison symbole+temps.
Oui, c'est vrai, mais si vous réfléchissez un peu, vous pouvez remplacer le tableau unidimensionnel par un tableau bidimensionnel dans la variante tableau.
Une telle question. Quelqu'un a-t-il déjà vu un modèle de code pour l'ouverture, la vérification et la fermeture des ordres, sans condition d'ouverture et de fermeture ? Je vais essayer d'écrire une condition moi-même, mais erreur sur erreur lorsque je commence à écrire un ordre de fermeture... En particulier, je suis mauvais pour trouver et vérifier les ordres de fermeture.
Vitaliy Medvedev: Voici une question. Quelqu'un d'autre a-t-il vu le code du modèle pour l'ouverture, la vérification et la fermeture des ordres sans aucune condition d'ouverture et de fermeture? J'ai essayé d'écrire une condition moi-même, mais quand je commence à écrire un ordre de fermeture erreur sur erreur... En particulier, je suis mauvais pour trouver et vérifier les commandes pour les fermer.
Il n'est pas surprenant que cela ne fonctionne pas bien. Après tout, s'il n'y a pas de conditions de clôture, alors la recherche et la vérification de ces ordres devraient se faire dans l'esprit suivant : trouver ceci, je ne sais quoi, et le clôturer.
Vous devez d'abord définir les conditions de choix de l'ordre à clôturer, et il sera ensuite beaucoup plus facile de l'analyser. Après tout, s'il y a un malentendu, nous n'aurons qu'à vérifier la conformité aux conditions connues.
Il n'est pas surprenant que cela ne fonctionne pas bien. Si nous n'avons pas de conditions de fermeture, alors la recherche et la vérification de ces ordres doivent se faire dans l'esprit suivant : trouver quelque chose et le fermer.
Tout d'abord, décidez des conditions de sélection des commandes pour la fermeture, et ensuite il sera plus facile de faire le tri. S'il y a un malentendu, nous n'aurons qu'à vérifier si les conditions dont nous sommes sûrs sont correctes.
Tout est clair, j'ai défini les conditions, mais l'ouverture des ordres selon les conditions (l'ouverture est toujours un déchet, j'arrive à peine à les ouvrir...),
Et d'autant plus, laclôture correctedes commandes ... Quel désordre !
Tout est clair, j'ai élaboré les conditions, mais l'ouverture des ordres selon les conditions, (l'ouverture est encore un non-sens, l'ouverture, avec difficulté...),
Et d'autant plus, laclôture correctedes commandes ... Quel désordre !
Si vous savez quel ordre vous avez choisi de fermer, alors fermez-le par son numéro de ticket.
Tout est clair, j'ai élaboré les conditions, mais l'ouverture des ordres selon les conditions, (l'ouverture est encore un non-sens, l'ouverture, avec un peu de peine...),
Et d'autant plus, laclôture correctedes commandes ... Quel désordre !
Voici comment elle est arrachée de mon cœur...
int Total_orders(int type)
{
int n=0;
int total=OrdersTotal();
for(int i=0; i<total; i++)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderType()!=type)continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
n++;
}
return(n);
}
//+------------------------------------------------------------------+void OrderOpen(int type,double sl)
{
double price=0.0;
double lot;
if(error>1)return;
if(type==WRONG_VALUE) return;
if(Risk!=0.0)lot=LotNormalize(LotVolume(Risk,sl));
else lot=LotNormalize(Lot);
do
{
if(type==OP_BUY)
{
RefreshRates();
price=NormalizeDouble(Ask,_Digits);
if(AccountFreeMarginCheck(_Symbol,type,lot)<=0)return;
}
if(type==OP_SELL)
{
RefreshRates();
price=NormalizeDouble(Bid,_Digits);
if(AccountFreeMarginCheck(_Symbol,type,lot)<=0)return;
}
int Ticket=OrderSend(_Symbol,type,lot,price,10000,0,0,CommentOrder,Magic);
if(Ticket>0)
{
error=Fun_Error(_Symbol,GetLastError());
Alert(__FUNCTION__,": open order ",StrToType(type)," ",_Symbol," :",Ticket);
}
else error=Fun_Error(_Symbol,GetLastError());
}
while(error==1 && !IsStopped());
}
//+------------------------------------------------------------------+void Order_Close(int type)
{
double price=0.0;
int total=OrdersTotal();
if(error>1)return;
for(int i=total-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderType()!=type)continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
do
{
if(OrderType()==OP_BUY)
{
RefreshRates();
price=NormalizeDouble(Bid,_Digits);
}
if(OrderType()==OP_SELL)
{
RefreshRates();
price=NormalizeDouble(Ask,_Digits);
}
int res=OrderClose(OrderTicket(),OrderLots(),price,10000);
if(res)
{
Alert(__FUNCTION__,": close order ",StrToType(OrderType())," ",OrderSymbol()," :",OrderTicket());
error=Fun_Error(_Symbol,GetLastError());
}
else error=Fun_Error(_Symbol,GetLastError());
}
while(error==1 && !IsStopped());
}
}
//+------------------------------------------------------------------+void ModifySL(int Stop_Loss)
{
if(Stop_Loss<=0)return;
double sl=0.0;
bool res;
int total=OrdersTotal();
for(int i=0; i<total; i++)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(OrderStopLoss()!=0)continue;
if(OrderType()==OP_BUY) sl=NormalizeDouble(OrderOpenPrice()-(New_Stop(Stop_Loss)*_Point),_Digits);
if(OrderType()==OP_SELL) sl=NormalizeDouble(OrderOpenPrice()+(New_Stop(Stop_Loss)*_Point),_Digits);
res=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
if(!res)Print(__FUNCTION__,": Error modifying StopLoss order ",StrToType(OrderType())," № - ",GetLastError()," ",OrderSymbol()," ",OrderTicket());
}
}
//+------------------------------------------------------------------+void ModifyTP(int Take_Profit)
{
if(Take_Profit<=0)return;
double tp=0.0;
bool res;
int total=OrdersTotal();
for(int i=0; i<total; i++)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(OrderTakeProfit()!=0)continue;
if(OrderType()==OP_BUY) tp=NormalizeDouble(OrderOpenPrice()+(New_Stop(Take_Profit)*_Point),_Digits);
if(OrderType()==OP_SELL) tp=NormalizeDouble(OrderOpenPrice() -(New_Stop(Take_Profit)*_Point),_Digits);
res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp,0);
if(!res)Print(__FUNCTION__,": Error modifying TakeProfit order ",StrToType(OrderType())," № - ",GetLastError()," ",OrderSymbol()," ",OrderTicket());
}
}
//+------------------------------------------------------------------+double LotVolume(double procent,double sl)
{
double lot=0.0;
double tv=MarketInfo(_Symbol,MODE_TICKVALUE);
double minlot=MarketInfo(_Symbol,MODE_MINLOT);
double maxlot=MarketInfo(_Symbol,MODE_MAXLOT);
if(sl!=0 && tv!=0) lot=(AccountFreeMargin()*procent)/(sl*tv*100.0);
if(lot < minlot)lot = minlot;
if(lot > maxlot)lot = maxlot;
return(lot);
}
//+------------------------------------------------------------------+double LotNormalize(double lot)
{
double minlot=MarketInfo(_Symbol,MODE_MINLOT);
double maxlot=MarketInfo(_Symbol,MODE_MAXLOT);
if(lot < minlot)lot = minlot;
if(lot > maxlot)lot = maxlot;
if(minlot==0.001) return(NormalizeDouble(lot,3));
if(minlot==0.01) return(NormalizeDouble(lot,2));
if(minlot==0.1) return(NormalizeDouble(lot,1));
return(NormalizeDouble(lot,0));
}
//+------------------------------------------------------------------+string StrToType(int type)
{
if(type==OP_BUY)return("Buy");
if(type==OP_SELL)return("Sell");
return(NULL);
}
//+------------------------------------------------------------------+int New_Stop(int Parametr)
{
int Min_Dist=(int)MarketInfo(_Symbol,MODE_STOPLEVEL);
if(Parametr<Min_Dist)
{
Parametr=Min_Dist*2+(int)MarketInfo(_Symbol,MODE_SPREAD);
Alert(_Symbol," Увеличина дистанция стоп-приказа.");
}
return(Parametr);
}
//+------------------------------------------------------------------+int Fun_Error(string symbol,int Error)
{
switch(Error)
{
case0:return(0);
case1:Alert(symbol," ",Error,":No error returned, but the result is unknown");return(2);
case2:Alert(symbol," ",Error,":Common error");return(2);
case3:Alert(symbol," ",Error,":Invalid trade parameters");return(2);
case4:Alert(symbol," ",Error,":Trade server is busy");Sleep(3000);return(1);
case5:Alert(symbol," ",Error,":Old version of the client terminal");return(2);
case6:Alert(symbol," ",Error,":No connection with trade server");Sleep(3000);return(1);
case7:Alert(symbol," ",Error,":Not enough rights");return(2);
case8:Alert(symbol," ",Error,":Too frequent requests");return(2);
case9:Alert(symbol," ",Error,":Malfunctional trade operation");return(2);
case64:Alert(symbol," ",Error,":Account disabled");return(2);
case65:Alert(symbol," ",Error,":Invalid account");return(2);
case128:Alert(symbol," ",Error,":Trade timeout");return(1);
case129:Alert(symbol," ",Error,":Invalid price");return(2);
case130:Alert(symbol," ",Error,":Invalid stops");return(2);
case131:Alert(symbol," ",Error,":Invalid trade volume");return(2);
case132:Alert(symbol," ",Error,":Market is closed");Sleep(10000);return(1);
case133:Alert(symbol," ",Error,":Trade is disabled");return(2);
case134:Alert(symbol," ",Error,":Not enough money");return(2);
case135:Alert(symbol," ",Error,":Price changed");return(1);
case136:Alert(symbol," ",Error,":Off quotes");Sleep(3000);return(1);
case137:Alert(symbol," ",Error,":Broker is busy");Sleep(3000);return(1);
case138:Alert(symbol," ",Error,":Requote");return(1);
case139:Alert(symbol," ",Error,":Order is locked");Sleep(10000);return(1);
case140:Alert(symbol," ",Error,":Buy orders only allowed");return(2);
case141:Alert(symbol," ",Error,":Too many requests");return(2);
case145:Alert(symbol," ",Error,":Modification denied because order is too close to market");Sleep(10000);return(1);
case146:Alert(symbol," ",Error,":Trade context is busy");Sleep(3000);return(1);
case147:Alert(symbol," ",Error,":Expirations are denied by broker");return(2);
case148:Alert(symbol," ",Error,":The amount of open and pending orders has reached the limit set by the broker");return(2);
case149:Alert(symbol," ",Error,":An attempt to open an order opposite to the existing one when hedging is disabled");return(2);
case150:Alert(symbol," ",Error,":An attempt to close an order contravening the FIFO rule");return(2);
default:Alert(symbol,":Error - № ",Error);return(2);
}
return(0);
}
Oh... Sans déconner ! Je n'ai pas fait autant... ! Ouais, eh bien... Maintenant je sais pourquoi les choses ne fonctionnent pas comme elles le devraient.
En effet, pendant l'exécution de la boucle, la valeur deOrdersTotal(); peut changer et vous pouvez manquer un ordre ou le corps de la boucle peut avoir un problème.
Voici une autre option utilisant la classe
Résultat du test
Dans le premier cas, un tableau de variables statiques est créé, chacune pour son propre symbole avec un délai fixe, c'est-à-dire qu'aucun autre délai ne peut être utilisé pour ce symbole ;
Dans le second cas, une classe pour chaque combinaison symbole + période.
Merci beaucoup, Sergei ! Si je comprends bien :
Dans le premier cas, un tableau de variables statiques est créé, chacune pour son propre symbole avec un délai fixe, c'est-à-dire qu'aucun autre délai ne peut être utilisé pour ce symbole ;
Dans le second cas, une classe pour chaque combinaison symbole+temps.
Voici une question. Quelqu'un d'autre a-t-il vu le code du modèle pour l'ouverture, la vérification et la fermeture des ordres sans aucune condition d'ouverture et de fermeture? J'ai essayé d'écrire une condition moi-même, mais quand je commence à écrire un ordre de fermeture erreur sur erreur... En particulier, je suis mauvais pour trouver et vérifier les commandes pour les fermer.
Il n'est pas surprenant que cela ne fonctionne pas bien. Après tout, s'il n'y a pas de conditions de clôture, alors la recherche et la vérification de ces ordres devraient se faire dans l'esprit suivant : trouver ceci, je ne sais quoi, et le clôturer.
Vous devez d'abord définir les conditions de choix de l'ordre à clôturer, et il sera ensuite beaucoup plus facile de l'analyser. Après tout, s'il y a un malentendu, nous n'aurons qu'à vérifier la conformité aux conditions connues.
Il n'est pas surprenant que cela ne fonctionne pas bien. Si nous n'avons pas de conditions de fermeture, alors la recherche et la vérification de ces ordres doivent se faire dans l'esprit suivant : trouver quelque chose et le fermer.
Tout d'abord, décidez des conditions de sélection des commandes pour la fermeture, et ensuite il sera plus facile de faire le tri. S'il y a un malentendu, nous n'aurons qu'à vérifier si les conditions dont nous sommes sûrs sont correctes.
Tout est clair, j'ai défini les conditions, mais l'ouverture des ordres selon les conditions (l'ouverture est toujours un déchet, j'arrive à peine à les ouvrir...),
Et d'autant plus, laclôture correctedes commandes ... Quel désordre !
Tout est clair, j'ai élaboré les conditions, mais l'ouverture des ordres selon les conditions, (l'ouverture est encore un non-sens, l'ouverture, avec difficulté...),
Et d'autant plus, laclôture correctedes commandes ... Quel désordre !
Tout est clair, j'ai élaboré les conditions, mais l'ouverture des ordres selon les conditions, (l'ouverture est encore un non-sens, l'ouverture, avec un peu de peine...),
Et d'autant plus, laclôture correctedes commandes ... Quel désordre !
Voici comment elle est arrachée de mon cœur...
Voici comment je l'obtiens de mon coeur.
Oh... Sans déconner ! Je n'ai pas fait autant... ! Ouais, eh bien... Maintenant je sais pourquoi les choses ne fonctionnent pas comme elles le devraient.
Merci beaucoup, humainement.
Tiens-le comme si ça venait de mon coeur.
Puis-je vous demander pourquoi vous faites ça ?
int total=OrdersTotal();
Puis-je demander pourquoi cela est fait ?
int total=OrdersTotal();