[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 46

 
rustein:

où est la question exactement ?
 
ilunga:
où est la question exactement ?
https://www.mql5.com/ru/forum/115354/page78
 

dans le code que vous avez donné, s'il n'y a qu'une seule commande, la boucle

for(;Cnt>=0;Cnt--)
    {
      RefreshRates();
      OrderSelect(Cnt,SELECT_BY_POS);
      if(OrderMagicNumber()==Magic)
      {
      TotalOpenOrders++;
      }
    }

La première fois, on tentera de sélectionner une commande qui n'existe pas.

 
ilunga:

dans le code ci-dessus, s'il n'y a qu'une seule commande, la boucle sera

La première fois, on tentera de sélectionner une commande qui n'existe pas.

Merci, je vais le corriger pour moi-même.
 
artmedia70:
Le terminal est entré dans une profonde réflexion, après environ 15 minutes, je l'ai tué.
rien...
Je l'aurais tué sans attendre une minute.
 
PapaYozh:

Immédiatement avant d'utiliser Ask et Bid, exécutez RefreshRates().


J'ai essayé, rien ne change

Fonction d'envoi de commande, tout semble être standard

 int OpenPosition(string AdvisorName,int Position,int Magic,double Lots,double StopLoss){ 
 int N; int Сount = 5; int Slippage = (CalculateSpread() * 2); 
 string PeriodString = GetPeriod(Period());
 if(Position == OP_BUY){double Price = NormalizeDouble(Ask,Digits); 
 string OrderName = " - Покупка по рынку";
 string ErrorName = "Ошибка открытия ордера на покупку";
 string CriticalErrorName = "Невозможно открыть ордер на покупку";
 string MailCriticalErrorName = "Ошибка открытия"; color Arrow = Gold;}
 if(Position == OP_SELL){Price = NormalizeDouble(Bid,Digits); 
 OrderName = " - Продажа по рынку"; ErrorName = "Ошибка открытия ордера на продажу";
 CriticalErrorName = "Невозможно открыть ордер на продажу";
 MailCriticalErrorName = "Ошибка открытия"; Arrow = YellowGreen;}
 
 while(IsTradeContextBusy() || !IsTradeAllowed()){int Interval = MathRand()+1000; 
 Print("Торговый поток занят. Повторная проверка через "+DoubleToStr((Interval/1000),0)+" сек"); 
 Sleep(Interval);} RefreshRates(); while(N < Сount){RefreshRates(); 
 int Ticket = OrderSend(Symbol(),Position,Lots,Price,Slippage,StopLoss,0,AdvisorName+
 OrderName,Magic,0,Arrow);
 if(Ticket > 0){if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){int Flag = 1; 
 PlaySound("recharge.wav"); break;}}
 else{Flag = 0; int PRM = GetLastError(); string ERR = Error(PRM,"OrderSend()"); 
 ErrorProcessing(AdvisorName+" "+PeriodString,ErrorName+" "+PRM+" ("+
 Error(PRM,"OrderSend()")+")","","OrderSend()"); N++; Sleep(5000);}
 if(N == Сount){ErrorProcessing(AdvisorName+" "+PeriodString,CriticalErrorName,
 MailCriticalErrorName+" "+PRM+" ("+Error(PRM,"OrderSend()")+")","OrderSend()");}}
 return(Flag);}
 
Dimoncheg:


J'ai essayé, rien ne change.

Fonction d'envoi de la commande, tout semble être standard


Tout d'abord, vous rafraîchissez les prix avec la fonction RefreshRates() et stockez le prix requis dans Price.

Ensuite, vous exécutez Sleep(Interval) et à ce moment-là, les cotations changent.

Ensuite, vous appelez OrderSend() avec le devis de l'année précédente.

Qu'attendez-vous en réponse ?

 
PapaYozh:


Tout d'abord, vous rafraîchissez les prix à l'aide de la fonction RefreshRates() et stockez le prix requis dans Price.

Ensuite, vous exécutez Sleep(Interval), et à ce moment-là, les cotations changent.

Et après cela, vous appelez OrderSend() avec le devis de l'année précédente.

Qu'attendez-vous en réponse ?


C'est ma faute, j'ai modernisé un peu au mauvais endroit, maintenant j'ai déplacé le prix hors de la fonction.

OpenPosition("Sovetneg",OP_BUY,NormalizeDouble(Ask,Digits),Magic,SlowlyIncreasingLots(0.2),MultiStop(OP_BUY,StopLoss));
La fonction elle-même est maintenant
 int OpenPosition(string AdvisorName,int Position,double Price,int Magic,double Lots,double StopLoss){ 
 int N; int Сount = 5; int Slippage = (CalculateSpread() * 2); 
 string PeriodString = GetPeriod(Period());
 if(Position == OP_BUY){
 string OrderName = " - Покупка по рынку";
 string ErrorName = "Ошибка открытия ордера на покупку";
 string CriticalErrorName = "Невозможно открыть ордер на покупку";
 string MailCriticalErrorName = "Ошибка открытия"; color Arrow = Gold;}
 if(Position == OP_SELL){
 OrderName = " - Продажа по рынку"; ErrorName = "Ошибка открытия ордера на продажу";
 CriticalErrorName = "Невозможно открыть ордер на продажу";
 MailCriticalErrorName = "Ошибка открытия"; Arrow = YellowGreen;}
 
 while(IsTradeContextBusy() || !IsTradeAllowed()){int Interval = MathRand()+1000; 
 Print("Торговый поток занят. Повторная проверка через "+DoubleToStr((Interval/1000),0)+" сек"); 
 Sleep(Interval);} while(N < Сount){RefreshRates(); 
 int Ticket = OrderSend(Symbol(),Position,Lots,Price,Slippage,StopLoss,0,AdvisorName+
 OrderName,Magic,0,Arrow);
 if(Ticket > 0){if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){int Flag = 1; 
 PlaySound("recharge.wav"); break;}}
 else{Flag = 0; int PRM = GetLastError(); string ERR = Error(PRM,"OrderSend()"); 
 ErrorProcessing(AdvisorName+" "+PeriodString,ErrorName+" "+PRM+" ("+
 Error(PRM,"OrderSend()")+")","","OrderSend()"); N++; Sleep(5000);}
 if(N == Сount){ErrorProcessing(AdvisorName+" "+PeriodString,CriticalErrorName,
 MailCriticalErrorName+" "+PRM+" ("+Error(PRM,"OrderSend()")+")","OrderSend()");}}
 return(Flag);}
Est-ce que ça a l'air bien maintenant ?
 

Bonjour.

Pouvez-vous me dire ce que signifie "type==4" ?

et type==5

dans l'extrait suivant :

double ma=iMA(Symbole(),PERIOD_D1,21,0,MODE_SMA,PRICE_CLOSE,0) ;

for(int k=1 ; k<=OrdersTotal() ; k++)
bool select=OrderSelect(k-1,SELECT_BY_POS) ;

if(select)
{
int type=OrderType() ;
int ticket=OrderTicket() ;

if (Bid<ma && type==4)
OrderDelete(ticket) ;
if (Bid>ma && type==5)
OrderDelete(ticket) ;
}

Je comprends que les conditions de suppression des commandes, par ma est claire, mais ensemble comment ?

Merci.

 
Dimoncheg:


Ça ne te semble pas juste maintenant ?


Non, ça ne l'est pas. C'est devenu encore pire :)

Comprenez que RefreshRates() met à jour les valeurs des variables Ask et Bid prédéfinies, vous utilisez la valeur une fois stockée dans la variable Price.