Questions des débutants MQL5 MT5 MetaTrader 5 - page 74

 
Bonjour, j'ai essayé de créer un indicateur qui utilise 2 symboles (EURUSD et GBPUSD par exemple), il ne s'affiche pas (donne une erreur 4806) ... Je récupère les handles des indicateurs dans la fonction OnInit (iRSI par exemple) de chaque symbole, je copie les données de l'indicateur dans des buffers et j'effectue d'autres opérations avec eux ...Il reçoit les données de l'indicateur pour un symbole (le même symbole qui coïncide avec le symbole sur le graphique, auquel j'attache l'indicateur) c'est ok, mais les données de l'indicateur pour le deuxième symbole ne sont pas reçues ... c'est-à-dire qu'il reçoit des données seulement pour le symbole qui coïncide avec le symbole sur le graphique, auquel il est attaché ... qu'est-ce que je fais mal ?
 
FinEngineer:
Bonjour, j'ai essayé de créer un indicateur qui utilise 2 symboles (EURUSD et GBPUSD par exemple), il ne s'affiche pas (donne une erreur 4806) ... Je récupère les handles des indicateurs dans la fonction OnInit (iRSI par exemple) de chaque symbole, je copie les données de l'indicateur dans des buffers et j'effectue d'autres opérations avec eux ...Il reçoit les données de l'indicateur pour un symbole (le même symbole qui coïncide avec le symbole sur le graphique, auquel j'attache l'indicateur) c'est ok, mais les données de l'indicateur pour le deuxième symbole ne sont pas reçues ... c'est-à-dire, il reçoit des données seulement pour le symbole qui coïncide avec le symbole sur le graphique, auquel l'indicateur est attaché ... qu'est-ce que je fais mal ?
Alors montrez-moi la partie du code qui a causé le problème.
 

Je poste tout le code, parce que rien ne fonctionne, sur mql4 tout était beaucoup plus facile, peut-être que je n'ai pas l'habitude... ces handles et buffers auxiliaires me tuent le cerveau.

Je pense que le sens est clair (différence de rsi de 2 symboles corrélatifs), s'il vous plaît aider....point les erreurs ?

#property copyright "Copyright 2012, MetaQuotes Software Corp.
#lien de propriété "http://www.mql5.com"
#propriété version "1.00"

//---- propriétés de rendu de l'indicateur
#property indicator_buffers 3
#property indicator_label1 "Pair_delta_RSI" (Pair_delta_RSI)
#property indicator_type1 DRAW_LINE
#property indicator_color1 Red
#propriété indicator_style1 STYLE_SOLID
#property indicator_width1 1
#propriété paramètres d'entrée
chaîne d'entrée Symbol1_Name = "EURUSD" ;
chaîne d'entrée Symbol2_Name = "GBPUSD" ;
entrée int PeriodRSI=7 ;
entrée bool Inversia=false ;
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE ;

doubleRSI_Buffer[] ;
double RSI1_Buffer[] ;
double RSI2_Buffer[] ;

int RSI1_Handle ;
int RSI2_Handle ;

int OnInit()
{
SetIndexBuffer(0,DeltaRSI_Buffer,INDICATOR_DATA) ;
SetIndexBuffer(1,RSI1_Buffer,INDICATOR_CALCULATIONS) ;
SetIndexBuffer(2,RSI2_Buffer,INDICATOR_CALCULATIONS) ;

RSI1_Handle=iRSI(Symbol1_Name,0,PeriodRSI,PRICE_CLOSE);//Recevoir les poignées de l'indicateur
RSI2_Handle=iRSI(Symbol2_Name,0,PeriodRSI,PRICE_CLOSE) ;
retour(0) ;
}

int OnCalculate(const int rates_total,const int prev_calculated,
const datetime &Time[],
const double &Open[],
const double &High[],
const double &Low[],
const double &Close[],
const long &TickVolume[],
const long &Volume[],
const int &Spread[])
{
int calculated=BarsCalculated(RSI1_Handle) ;
if(calculated<rates_total)
{
Print("Toutes les données de RSI1_Handle ne sont pas calculées (",calculated, "bars ). Erreur",GetLastError()) ;
retour(0) ;
}
calculated=BarsCalculated(RSI2_Handle) ;
if(calculated<rates_total)
{
Print("Toutes les données de RSI2_Handle ne sont pas calculées (",calculated, "bars ). Erreur",GetLastError()) ;
retour(0) ;
}
//--- on ne peut pas copier toutes les données
int to_copy ;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total ;
sinon
{
to_copy= taux_total-prev_calculé ;
si(prev_calculé>0) to_copy++ ;
}
//recevoir le tampon RSI1
if(CopyBuffer(RSI1_Handle,0,0,to_copy,RSI1_Buffer)<=0)
{
Print("La récupération de RSI1 a échoué ! Erreur",GetLastError()) ;
retour(0) ;
}
//Récupérer le tampon RSI2
if(CopyBuffer(RSI2_Handle,0,0,to_copy,RSI2_Buffer)<=0)
{
Print("La récupération de RSI2 a échoué ! Erreur",GetLastError()) ;
retour(0) ;
}
//---
int limite ;
si(prev_calculé==0)
limite=0 ;
sinon limit=prev_calculated-1 ;
//calculer l'indicateur delta rsi
for(int i=limit;i<rates_total ; i++)
DeltaRSI_Buffer[i]=RSI1_Buffer[i]-RSI2_Buffer[i] ;
retour(taux_total) ;
}

Automated Trading and Strategy Testing
Automated Trading and Strategy Testing
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 

erreur n°1

le défaut d'utilisation de la clé SRC

 

Une telle erreur se produit, par exemple, si vous prenez un indicateur MACD personnalisé standard et modifiez la ligne suivante

ExtFastMaHandle=iMA(NULL,0,InpFastEMA,0,MODE_EMA,InpAppliedPrice) ;

à

ExtFastMaHandle=iMA("EURUSD",0,InpFastEMA,0,MODE_EMA,InpAppliedPrice) ;

Si le MACD est attaché au graphique EURUSD, tout sera dessiné, s'il est attaché à un autre graphique - l'erreur 4806 apparaîtra... Comment puis-je faire en sorte que dans cet indicateur je puisse utiliser autant de symboles que je veux ?

Si vous savez comment faire fonctionner l'indicateur précédemment publié, je vous en serais très reconnaissant.

 
mario065:

Lester: Ici j'ai mis un modèle, à l'intérieur il y a une modification montrant comment ramper.

https://www.mql5.com/ru/forum/6343/page73

Si vous ne voulez pas le faire, vous devez compter les variables correctement.

J'ai eu l'idée du fichier Schablon avec un succès mitigé, je l'ai un peu adapté à mes conditions et ça marche. Cependant, il y a une impasse importante pour moi - ils sont fixés sur la bougie suivante, pas sur un tick. Voici la partie de l'EA.

  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
  
  if(PositionSelect(_Symbol))
  {
     Open = PositionGetDouble(POSITION_PRICE_OPEN);
     SL   = PositionGetDouble(POSITION_SL);
     T_P  = PositionGetDouble(POSITION_TP);
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
     buy_trail = NormalizeDouble(Bid - Open,Digits());
     sel_trail = NormalizeDouble(Open - Ask,Digits()); 
    
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
    {
    if(!PositionGetDouble(POSITION_SL))
      {
      PositionModify(_Symbol,NormalizeDouble((Open-STR-TR),Digits()),NormalizeDouble((Open+TP),Digits()));
      }
 
Lester:

Avec un succès variable, j'ai obtenu l'essentiel du fichier Schablon, je l'ai ajusté un peu à mes conditions et Hourra - les stops et les profits sont fixés. Cependant, il y a une impasse importante pour moi - ils sont fixés sur la bougie suivante, pas sur un tick. Voici une partie du code.

input double TP            = 0.003;
input double STR           = 0.0012;
input double TR            = 0.0002;
//=============================================== 
//Един вид извикване на модификация на отворената позиция
  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
Ну ладно-обяснения:

  if(PositionSelect(_Symbol)){//Ест ли позиция по символа
     Open = PositionGetDouble(POSITION_PRICE_OPEN);//цена опен для поза
     SL   = PositionGetDouble(POSITION_SL);//цена стоп для поза
     T_P  = PositionGetDouble(POSITION_TP);//цена тейк для поза
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);//цена бид
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);//цена аск
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);//стоп ниво,если ест такое-оно в пункты
     buy_trail = NormalizeDouble(Bid - Open,Digits());//вычисляем разстояние от цена бид и цена опен позиции-ето для бай
     sel_trail = NormalizeDouble(Open - Ask,Digits());//вычисляем разстояние от цена опен позиции и цена аск-ето для сел
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)//если ест бай поза
      {
      if(buy_trail > STR)//если разстояние болше указаное
       {
        if(NormalizeDouble((Bid - STR),Digits()) >= Open && Open > SL)
//если цена бид минус указаное разстояние болше щем цена опен и цена опен болше цена стоп-вызиваем модификация
//сама модификация-для стоп будет цена опен,цена тейк не меняем.
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Bid - TR),Digits()) > SL && Open <= SL)
//если цена бид минус указаное разстояние TR = 0.0002 болше уже от новый стоп(который поменяли уже) и цена опен менше новый стоп 
//вызиваем модификация
//сама модификация - для стоп будет прошлый стоп минус стоп ниво* _Point(что б стали пипси) плюс указаное TR,цена тейк не меняем.
//Т.е. будем двигат стоп через каждые 2 пипса  
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL - L_S * _Point) + TR),Digits()),T_P);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      if(sel_trail > STR)
       { 
        if(NormalizeDouble((Ask + STR),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Ask + TR),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL +L_S * _Point)- TR),Digits()),T_P);
           }
        }
      }
     } 
//===============================================

Le code doit toujours contenir des conditions pour certaines actions, mais tout doit être vérifié et avoir une certaine logique.

Si vous voulez aider, imprimez(" ", ) ; ) et voyez le résultat.

 
mario065:

Les descriptions sont toutes claires et elles fonctionnent. Mais il s'agit d'une modification du "breakeven" et du "trailing". Je devrais écrire une modification pour fixer le StopLimit et le TakeProfit après l'ouverture de l'ordre, c'est à dire

1. ouverture de la commande

--------

2. Modification du réglage de la limite d'arrêt (ceci n'est pas encore disponible !)

 if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
    {
    if(!PositionGetDouble(POSITION_SL))
      {
      PositionModify(_Symbol,NormalizeDouble((Open-STR-TR),Digits()),NormalizeDouble((Open+TP),Digits()));
      }

------

3. modification pour le seuil de rentabilité

4. modification du stop suiveur

5.fermer la commande


Vous pouvez utiliser le point 2 pour modifier l'ordre, mais uniquement au début de la barre suivante.

 

Une fonction est écrite pour ouvrir eats :

Сама функция(символ,обем,проскалзивание,стоп,тейк,магик)
С вызова функции можно все сразу поставит.
bool BuyPositionOpen(const string symbol,double volume,ulong deviation,double StopLoss,double Takeprofit,int Magic)     
    if(Какое то условие)
      {
       BuyPositionOpen(_Symbol,Lot,0,NormalizeDouble(Ask - 0.003,_Digits),NormalizeDouble(Ask + 0.003,_Digits),MagicNumber);
      }
     if(Какое то условие)
      {
       SellPositionOpen(_Symbol,Lot,0,NormalizeDouble(Bid + 0.003,_Digits),NormalizeDouble(Bid - 0.003,_Digits),MagicNumber);
      }
Функция для закрития:
Сама функция(символ,проскалзивание,магик)
bool BuyPositionClose(const string symbol,ulong deviation,int Magic)
// Логика за затваряне на дългите
      if(Какое то условие){
         BuyPositionClose(_Symbol,0,MagicNumber);}                        
// Логика за затваряне на късите
      if(Какое то условие){
         SellPositionClose(_Symbol,0,MagicNumber);} 

Если не хочете сразу ставит стоп и тейк,тогда:
//=============================================== 
//Един вид извикване на модификация на отворената позиция
  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
  if(PositionSelect(_Symbol)){
     Open = PositionGetDouble(POSITION_PRICE_OPEN);
     SL   = PositionGetDouble(POSITION_SL);
     T_P  = PositionGetDouble(POSITION_TP);
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
     buy_trail = NormalizeDouble(Bid - Open,Digits());
     sel_trail = NormalizeDouble(Open - Ask,Digits());
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {
if(SL = 0 && T_P = 0)//если стоп и тейк равни нулю-вызиваете модофикация и там акуратно ложите нужная вам цена
{
  ModifyPosition(_Symbol,NormalizeDouble((Open - 0.003),Digits()),NormalizeDouble((Open + 0.003),Digits()));
}
//Далше вам понятно:
      if(buy_trail > STR)
       {
        if(NormalizeDouble((Bid - STR),Digits()) >= Open && Open > SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Bid - TR),Digits()) > SL && Open <= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL - L_S * _Point) + TR),Digits()),T_P);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      if(sel_trail > STR)
       { 
        if(NormalizeDouble((Ask + STR),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Ask + TR),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL +L_S * _Point)- TR),Digits()),T_P);
           }
        }
      }
     } 
//=============================================== 
 
Y a-t-il des développeurs MQL5 dans ce fil de discussion ? Est-ce que je pose une question dans la mauvaise branche ? Alors dites-moi comment poser une question aux développeurs ? La question ci-dessus est élémentaire pour un programmeur expérimenté...