Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 31
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
L'erreur se situe quelque part plus haut dans le code, dans la zone de sélection des commandes.
Je ne touche pas au reste.
Dans tous les cas, vous devez voir le code précédent et le code suivant, et pas seulement les lignes de condition.
...
Voulez-vous nettoyer le code et le coller correctement, en utilisant le SRC ?
Pourquoi n'appliquez vous pas OrderSelect avant d'essayer de supprimer ?
...
Je ne sais pas pourquoi vous avez besoin de tant de boucles à cet endroit, alors que vous pouvez remplir les champs de structure requis concernant le nombre d'ordres et de positions en une seule fois.
J'ai supprimé les choses inutiles, et j'ai également supprimé la suppression. Il n'est pas nécessaire de supprimer par ticket (il faut quand même le connaître avant de supprimer), mais dans la boucle pour trouver le bon ordre par index, et le supprimer.
Donc, nous avons besoin d'une fonction supplémentaire pour rechercher et supprimer les ordres, qui devrait être appelée en cas de condition, mais quel type de condition - je n'ai pas compris tout de suite en regardant votre code, et je n'ai pas eu le temps de le regarder. Décrivez les conditions nécessaires en mots et nous vous dirons comment supprimer.
Je l'avais écrit tout seul, sans regarder, donc il peut y avoir des erreurs dans la fonction qui remplit la structure avec le nombre d'ordres et de positions - je ne l'ai pas vérifié.
input double LotB=0.1; // Лот Buy
input double LotS=0.1; // Лот Sell
input int Pointsl=100; // StopLoss в пунктах
input int Pointtp=100; // TakeProfit в пунктах
input int NumBars=10; // Количество баров для поиска Max/Min
input int Magic=100500; // Magic
//--- global variables
struct DataNumOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
int buy_limit; // Количество ордеров BuyLimit
int buy_stop; // Количество ордеров BuyStop
int sell_limit; // Количество ордеров SellLimit
int sell_stop; // Количество ордеров SellStop
};
DataNumOrders numOrders; // Количество ордеров
double lotB, lotS;
int pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
pointsl=(Pointsl<0?0:Pointsl);
pointtp=(Pointtp<0?0:Pointtp);
double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- заполним структуру количеством ордеров и позиций
GetNumOrders(Symbol(),Magic,numOrders);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice=0.0; double minPrice=DBL_MAX;
for(int i=0; i<numBars; i++) {
double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
if(max_i>maxPrice) maxPrice=max_i;
double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
if(min_i<minPrice) minPrice=min_i;
}
//--- выставим BuyLimit
if(numOrders.buy_limit==0 && numOrders.buy==0) {
double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
if(ticketUP==-1) Print("ERROR OP_BUY");
else Print("OP_BUY OK");
}
//--- выставим SellLimit
if(numOrders.buy_limit==0 && numOrders.sell==0) {
double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
if(ticketD==-1) Print("ERROR OP_SELL");
else Print("OP_SELL OK");
}
//--- Тут должно быть удаление, но не понятно при каких условиях. Опишите их
//---
string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
}
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataNumOrders &number_of) {
ZeroMemory(number_of);
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
if(OrderType()==OP_BUY) number_of.buy++;
if(OrderType()==OP_BUYLIMIT) number_of.buy_limit++;
if(OrderType()==OP_BUYSTOP) number_of.buy_stop++;
if(OrderType()==OP_SELL) number_of.sell++;
if(OrderType()==OP_SELLLIMIT) number_of.sell_limit++;
if(OrderType()==OP_SELLSTOP) number_of.sell_stop++;
}
}
}
//+------------------------------------------------------------------+
En général, qu'essayez-vous de faire avec ce code, désolé, effrayant ?
comment écrire ce qui suit :
Si le prix a changé de 1%, disons que le jour d'ouverture est supérieur au jour de fermeture de 1%.
comment écrire ce qui suit :
Si le prix a changé de 1%, disons que le jour OUVERT est supérieur au jour FERME de 1%.
C'est différent, maintenant on sait clairement à quoi se rapporte le 1% ;)
L'Expert Advisor compte les min et max des X dernières barres et place des ordres en fonction de ceux-ci. En outre, s'il y a une diminution du maximum ou une augmentation du minimum, vous devez supprimer l'ordre correspondant et l'ouvrir avec les nouvelles données.
Pourquoi supprimer quand on peut modifier le prix de fixation et le stop et le takeout par rapport au nouveau niveau ? Après tout, vous ne placez des ordres en attente que lorsqu'il n'y a pas d'ordres en attente ni de positions sur le marché. Donc : s'il y a un ordre en attente sur le marché et qu'il n'y a pas de position correspondante sur le marché, il suffit de modifier les prix de l'ordre en attente - le prix fixé à un nouveau niveau et son ordre stop - respectivement au nouveau niveau.
A chaque fois, vous devez vous souvenir des prix trouvés de Max et Min. Si le prix actuel trouvé de Max est inférieur au précédent, nous modifions la BuyLimit en attente et mémorisons le nouveau prix de Max. Pour le prix de Min, le miroir.