Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 1067

 

À l'aide, s'il vous plaît ! Il y a 2 fichiers : un indicateur et un Expert Advisor. Comment faire correctement référence à la fonction dans l'indicateur via #include ? iCustom ne convient pas pour diverses raisons. C'est ce que j'ai écrit dans l'indicateur :

bool BuyTrue(double& переменная, int переменная) export
{
   //тело функции

   return(true);
}   

Et voici ce que j'ai écrit dans le conseiller expert :

#import "НазваниеИндикатора.ex4"
   bool BuyTrue(double& переменная, int переменная);
if (BuyTrue(переменная, переменная))
Opn_B = true;

Mais pour une raison quelconque, le conseiller expert ne fonctionne pas, l'indicateur n'apparaît pas dans le graphique des prix pendant les tests. L'ai-je écrit correctement, et s'il y a une erreur, où se trouve-t-elle ?

 
AlexeyVik:

Tuta.


Je n'en ai pas. Mais il y a bien un fichier quelque part, j'en tire les informations enregistrées.


 

S'il vous plaît aidez-moi à compiler à mt4

FileClose' - l'expression de type 'void' est illégale TickToCVS~.mq4 84 12

Dossiers :
 
abeiks:

Je n'en ai pas. Mais il y a bien un fichier quelque part et j'en tire les informations enregistrées.


Ma capture d'écran montre que le menu provient de MetaEditor et votre capture d'écran provient de MT.
 
AlexeyVik:

C'est la valeur EMPTY_VALUE

Cherchez où il apparaît.

Merci. Vous m'avez aidé à résoudre le problème. Mon indicateur, lorsqu'il est chargé, calcule les barres à partir de la première, pas à partir de zéro (je l'ai fait exprès), à zéro il calcule sur l'historique des tick, pas sur les données historiques. Maintenant, lorsque je change de timeframe, que je l'attache au graphique et que je redémarre le terminal, je remets les valeurs de la mémoire tampon à zéro à la barre 0, problème résolu.
 
AlexeyVik:
Ma capture d'écran montre que le menu provient de MetaEditor et votre capture d'écran provient de MT.
C'est ça ! Merci !
 
Comment puis-je obtenir le prix d'ouverture d'un ordre dans l'historique et non le prix d'une position ouverte si cet ordre a été déclenché ? Dans la fonction ci-jointe, si un ordre a été déclenché, cet ordre ne peut être trouvé que dans les positions, donc cela ne fonctionne pas. Et dans les positions, nous avons seulement le prix de la position ouverte mais pas le prix de l'ordre.
double GetPriceLastCloseOrder(string sy="", int mn=-1) {
  datetime t=0;
  int      i, k=OrdersHistoryTotal(); 
  double r=0;

  if (sy==NULL) sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()>1 && OrderType()<6) {
          if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            r=OrderOpenPrice();
          }
        }
      }
    }
  }
  return(r);
}  
 

Bonjour, ma question est la suivante : je ne peux pas modifier une commande. Il y a deux aspects à cela, je ne comprends pas les mathématiques de la modification, alors s'il vous plaît expliquez-moi.

De la façon dont je le vois, SL= IF ORDERSELEKT,Bid-ORDERSTOPLOS*POINT,DIGITS

le deuxième aspect. appris de la vidéo XBMS

comment je n'ai pas essayé de changer les valeurs des variables dans le testeur eror 130 pas correct stop loss et d'autres conneries du genre

2016.06.28 21:42:23.402 2016.06.23 00:00 trade RSI inputs : Lots=0.1 ; Slippage=5 ; StopLoss=10 ; TakeProfit=30 ; RSIPeriod=7 ; Magic=1087 ;

bien qu'il y ait une multiplication à partir des chiffres et de la fonction sur le cas d'une mauvaise SL


extern double Lots = 0.1 ;

extern int Slippage = 10 ;

extern int StopLoss = 10 ;

extern int TakeProfit =30 ;

extern int RSIPeriod = 7 ;

extern int Magic =1087 ;

double MaRSI ;


int TP,SL ;

bool tfu ;


//+------------------------------------------------------------------+

//| Fonction d'initialisation de l'expert |

//+------------------------------------------------------------------+

int OnInit()

{

si(Chiffres == 3||Chiffres == 5)

{

Dérapage *= 10 ;

TakeProfit *= 10 ;

StopLoss *= 10 ;

}

return(INIT_SUCCEEDED) ;

}

//+------------------------------------------------------------------+

//| Fonction de désinitialisation experte |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{


}

//+------------------------------------------------------------------+

//| fonction tick expert |

//+------------------------------------------------------------------+

void OnTick()

{

//+------------------------------------------------------------------+

//ouverture de la vente

//+------------------------------------------------------------------+

MaRSI=iRSI(Symbole(),0, RSIPeriod,PRICE_CLOSE,1) ;

si(CountTrades() <= 0&MaRSI<=30 )

{

if( SendOrder(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0, "test",Magic,0,Green))

{ int ticket = OrderTicket() ;

SL = NormalizeDouble( Ask - StopLoss*Point,Digits) ;

TP = NormalizeDouble( Ask + TakeProfit*Point,Digits) ;

ModifyOrder(ticket,OrderOpenPrice(),SL,TP,0,Black) ;

}

}// if(CountTrades <= 0&MaRSI>=70 )

//+------------------------------------------------------------------+

//ouverture de l'achat

//+------------------------------------------------------------------+


}//ONTICK


//+------------------------------------------------------------------+

//+compteur de commandes

//+------------------------------------------------------------------+


int CountTrades ()

{

int count = 0 ;

for(int i = OrdersTotal()-1;i>=0;i--)

{

if( OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)//si l'ordre est le nôtre

count++;//augmenter le compteur

}//select order by index

}// order.i===premier ordre.

return(count);//renvoie le nombre de commandes

}/// fonction

//+------------------------------------------------------------------+

//fonction de placement des commandes avec gestion des erreurs

//+------------------------------------------------------------------+

int SendOrder( string symbol,int cmd,double volume,double price,int slippage,double stoploss,

double takeprofit,string comment,int magic=0,date expiration=0,color arrow_color=CLR_NONE)

{

int err = GetLastError() ;

err =0 ;

bool exit_cikl = false ;

int ticket = -1 ;

int Retry = 10 ; //nombre de tentatives pour établir une commande

int cnt = 0 ; //compte des essais

if(cmd == OP_BUY || cmd == OP_SELL)

{

while(!exit_cikl)

{

ticket = OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color) ;

err= GetLastError() ;

switch(err)

{

cas ERR_NO_ERROR :

exit_cikl = true ;

pause ;

{ cas ERR_SERVER_BUSY :

cas ERR_NO_CONNECTION :

cas ERR_INVALID_PRICE :

cas ERR_OFF_QUOTES :

cas ERR_BROKER_BUSY :

cas ERR_TRADE_CONTEXT_BUSY :

cnt++ ;

pause ;

cas ERR_PRICE_CHANGED :

cas ERR_REQUOTE :

RefreshRates() ;

continuer ;

par défaut :

exit_cikl = true ;

pause ;

}// switch switch(err)

si(cnt > Retry)

exit_cikl = true ;

si(!exit_cikl)

{

Sleep(1000) ;

RefreshRates() ;

}//si nous ne sortons pas de la boucle if(!exit_cikl)

sinon

{

si(err != ERR_NO_ERROR)

{

Print("Erreur : " + IntegerToString(err)) ;

}// s'il y a toujours une erreur if(err != ERR_NO_ERROR)

}// OTHERWISE

if(err==ERR_NO_ERROR)

{

if( OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)

retour(ticket) ;

}// if(err==ERR_NO_ERROR)

Print("Erreur d'ouverture de l'ordre après " + IntegerToString(cnt) + "tentatives") ;

retour(-1) ;

} //cycle while

}// si le type d'ordre est Achat ou Vente

retour(ticket) ;

}// Fonction SendOrder


//-------------------------------------------------------------------------------------------------------------

//fonction modifier l'ordre

//------------------------------------------------------------------------------------------------------------

ModifyOrder(int ticket,double price,double stoploss,double takeprofit,datetime expiration,colour arrow_color)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

{

prix = NormalizeDouble(prix,chiffres) ;

stoploss = NormalizeDouble(stoploss,Digits) ;

takeprofit = NormalizeDouble(takeprofit,Digits) ;

CheckValidStop(Symbol(),price,stoploss);//fonction permettant de modifier le stop minimum

int err = GetLastError() ;

err = 0 ;

int Retry = 10 ;

int cnt = 0 ;

bool exit_cikl = false ;

bool result ;

while(!exit_cikl)

{

result = OrderModify(ticket, price,stoploss,takeprofit,expiration, arrow_color) ;

err = GetLastError() ;

si(résultat == vrai)

{

Print("Commande #"+ IntegerToString(ticket), "modifiée avec succès") ;

retour (vrai) ;

}

switch(err)

{

cas ERR_NO_ERROR :

exit_cikl = true ;

pause ;

{ cas ERR_SERVER_BUSY :

cas ERR_NO_CONNECTION :

cas ERR_INVALID_PRICE :

cas ERR_OFF_QUOTES :

cas ERR_BROKER_BUSY :

cas ERR_TRADE_CONTEXT_BUSY :

cnt++ ;

pause ;

cas ERR_PRICE_CHANGED :

cas ERR_REQUOTE :

RefreshRates() ;

continuer ;

par défaut :

exit_cikl = true ;

pause ;

}// switch switch(err)

}// while(!exit_cikl)

si ( err != ERR_NO_ERROR)

{

Print("Erreur lors de la modification de la commande # " + IntegerToString(ticket)) ;

Print("Code d'erreur : " + IntegerToString(err)) ;

}

}//(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

sinon

{

Print("La sélection de la commande a échoué, ticket = " + IntegerToString(ticket)) ;

retour (faux) ;

}//si quelque chose ne va pas

retour (vrai) ;

}// fonction modifier

//----------------------------------------------------------------------------------------------------

//ChtckValidStop

//--------------------------------------------------------------------------------------------------

void CheckValidStop(string symbol,double price,double& sl)

{

si(sl==0)

retour ;

double min_stop_server = MarketInfo(symbol,MODE_STOPLEVEL)*MarketInfo(symbol,MODE_POINT) ;

si(MathAbs(prix-sl) <= min_stop_server)

{

si(prix>sl)

sl = prix - min_stop_server ;

autre sl = sl + min_stop_server ;

}// if(MathAbs(price-sl) <= min_stop_server)

sl = NormalizeDouble(sl,MarketInfo(symbol,MODE_DIGITS))

}/// fonction


 

VEUILLEZ ME CONSEILLER ! !!

Il y a deux ordres dans l'historique des transactions : 1) VENDRE № tic 415 STOPLOSS 1.1000 lot 0.01 2) VENDRE № tic 418 STOPLOSS 1.1000 lot 0.02

Je dois affecter les variables X=tick, Y=STOPLOSS et B=lot si le prix Asc est égal au STOPLOSS de l'ordre SELL. Comment affecter les premières valeurs au premier ordre, puis au second. Avec moi, il attribue toujours une valeur à la première commande.

 
m8akca:

VEUILLEZ ME CONSEILLER ! !!

Il y a deux ordres dans l'historique des transactions : 1) VENDRE № tic 415 STOPLOSS 1.1000 lot 0.01 2) VENDRE № tic 418 STOPLOSS 1.1000 lot 0.02

Je dois affecter les variables X=tick, Y=STOPLOSS et B=lot si le prix Asc est égal au STOPLOSS de l'ordre SELL. Comment affecter les premières valeurs au premier ordre, puis au second. Avec moi, il attribue toujours une valeur à la première commande.

Cette rubrique est destinée à aider ceux qui ont déjà écrit quelque chose, mais qui ne fonctionne pas tout à fait comme je le voudrais. Veuillez soumettre votre code afin que les autres personnes ici présentes puissent voir ce qui ne va pas et vous aider.

Et si vous voulez être écrit sur commande, c'est là que ça se passe.

Raison: