Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 7

 
Bonjour, je n'ai pas trouvé de fil de discussion sur la mise à niveau du terminal Metatrader 4 pour Android 2.3, alors s'il vous plaît, ne m'en voulez pas trop de poster dans ce fil de discussion. Sur le marché, le terminal est uniquement pour Android 4+. Où puis-je obtenir une mise à jour, car le mien ne fonctionne plus.
 
k19alex69:
Bonjour, je n'ai pas trouvé de fil de discussion sur la mise à niveau du terminal Metatrader 4 pour Android 2.3, donc s'il vous plaît ne me donnez pas trop de coups de pied pour poster dans ce fil de discussion. Sur le terminal du marché uniquement pour Android 4+. Où puis-je obtenir une mise à jour, car le mien ne fonctionne plus.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Le terminal mt5 et mt4 ne fonctionne pas

Renat Fatkhullin, 2016.11.13 23:51

Désolé, nous ne prenons plus en charge les versions d'Android inférieures à 4.0.3.

 
Sergey Basov:

Je n'ai rien à y expliquer, donc personne ne répond. Le graphique que vous avez montré n'a aucun sens et la façon dont il a été obtenu est un mystère.

L'option "Surface bidimensionnelle" dans l'onglet "Graphique d'optimisation" du testeur prend tout son sens (imho) lorsque nous avons besoin d'optimiser 2 paramètres d'entrée du Conseiller Expert, ou de voir visuellement à quelles valeurs de 2 paramètres sur l'historique ont été obtenus de bons résultats, si ces paramètres sont interdépendants, et s'ils ont un sens du tout.

Vous n'avez que des 0 sur les deux axes pour une raison quelconque, et verticalement ces 0 sont divisés en 3 étapes intermédiaires, de sorte que vous avez "des cubes un au centre, deux plus bas/haut, et deux/trois dans le même carré". Et les résultats semblent aléatoires - des "cubes" blancs et verts dispersés au hasard. Le graphique n'a donc aucun sens et ne semble pas vouloir dire grand-chose.

Le graphique peut ne pas avoir de sens, mais après l'optimisation dans la période de 2014-2015 et lors de la sélection et la mise en place de meilleurs paramètres et de nouveaux tests de 2014 à aujourd'hui, le résultat de la perte / drawdown restent inchangés, bien, le bénéfice augmente en proportion de la période. De plus, le robot a travaillé sur une démo pendant un mois, et pendant les tests du dernier mois avec les paramètres par défaut, toutes les transactions coïncident avec le testeur = +5pp. Donc, je ne vais pas jouer avec les cubes et leur couleur.

Merci pour cette précision.

 
Bonjour !
J'essaie d'apprendre MQL4 et, par conséquent, ne vous sentez pas mal à l'aise avec ma question.
Comment calculer correctement le SL et le TP d'un ordre en attente, dans le cas où il n'est pas placé sur le prix actuel mais sur le prix obtenu lors des calculs ?
Ils doivent être calculés sur la base de la longueur du chandelier. C'est à peu près comme ça :
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits) ;
Merci !
 
Viachaslau Baiko:
Bonjour !
J'essaie d'apprendre MQL4, alors ne vous sentez pas mal à l'aise avec ma question.
Veuillez m'indiquer comment calculer correctement le SL et le TP d'un ordre en attente et si celui-ci est placé non pas au prix actuel mais au prix obtenu lors des calculs.
Ils doivent être calculés sur la base de la longueur du chandelier. C'est à peu près comme ça :
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits) ;
Merci !

Voici les fonctions qui calculeront les ordres stop corrects pour tout type d'ordre :

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+
 
void OnTick()
  {
//---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if(server_time.min%minutesBefore==0 || server_time.min==0) {
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) {
         //--- получили сигнал на покупку
         Print("Сигнал на покупку ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на покупку
         if (OrdersTotal() == 0)  
         {
         ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);  
         Alert ("Есть сигнал на покупку  ", sim, per);
         }
         if (OrdersTotal() >0)  
    
     if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
     if(OrderType()==OP_SELL)
     {
     OrderClose(ticket, OrderLots(), Bid,0,Blue);
     {
     ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);
     Alert ("Есть сигнал на закрытие продажи и открытие покупки  ", sim, per);
     }
     }
    
    
         //--- вызов функции открытия позиции на покупку
         }
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) {
         //--- получили сигнал на продажу
         Print("Сигнал на продажу ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на продажу
         if (OrdersTotal() == 0)  
         {
         ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
         Alert ("Есть сигнал на продажу  ", sim, per);
         }
         if (OrdersTotal() >0)  
    
     if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
     if(OrderType()==OP_BUY)
     {
     OrderClose(ticket, OrderLots(), Ask,0,Red);
     {
     ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
     Alert ("Есть сигнал на закрытие покупки и открытие продажи  ", sim, per);
     }
     }
         //--- вызов функции открытия позиции на продажу
         }
      }
  }
Un conseil. Je dois ouvrir un court-circuit, par exemple. En cas de signal d'achat, il faut fermer la position courte et ouvrir la position longue.
 
Artyom Trishkin:

Voici les fonctions qui calculeront les ordres stop corrects pour tout type d'ordre :

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+
Merci, Artem, je vais m'en occuper.
 
Viachaslau Baiko:
Merci, Artem, je vais me pencher sur la question.

Vous êtes les bienvenus. Partout où vous avez besoin d'obtenir des prix stop précis, en connaissant le prix ouvert d'un marché ou d'un ordre en attente, obtenez les prix requis avec ces fonctions - elles renverront des prix déjà calculés pour l'ordre stop requis.

Supposons que vous ayez le prix fixé d'un ordre en attente :
double priseSet=1.12345 ;
Alors le prix stop loss
int StopLoss=20 ; points pour BuyLimit sera :
double sl=CorrectStopLoss(Symbol(),OP_BUYLIMIT,priceSet,StopLoss) ;

La variable sl prendra le stop loss correctement calculé pour BuyLimit avec les exigences StopLevel.

 
strongflex:
Voici un conseil. Supposons qu'une position courte soit ouverte. Lorsqu'un signal d'achat apparaît, il faut fermer la position courte et ouvrir la position longue.

Vérifiez s'il existe une position de vente ouverte. Si c'est le cas, fermez-la.

Ensuite, ouvrez une position d'achat.

C'est élémentaire.

 

J'ai très envie d'utiliser mql4 pour mettre en œuvre un tel algorithme :

Il existe deux terminaux MT4 provenant de courtiers différents. Dans l'un d'eux, il y a un indicateur "exclusif", qui ne peut pas être déplacé vers un autre terminal (comme dans Market).

Et alors ? Est-il possible de prendre les lectures des tampons de l'indicateur "exclusif" et de les implémenter dans votre propre indicateur dans votre propre terminal ?

Les ressources ne fonctionnent pas d'une manière ou d'une autre.

Raison: