Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 74

 
Hallo! Ich habe versucht, einen Indikator zu erstellen, der 2 Symbole verwendet (z.B. EURUSD und GBPUSD), er zeichnet nicht (gibt einen Fehler 4806) ... Ich erhalte Indikator-Handles in der OnInit-Funktion (z.B. iRSI) jedes Symbols, ich kopiere Indikator-Daten in Puffer und führe weitere Operationen mit ihnen durch ...Es empfängt Indikatordaten für ein Symbol (das gleiche Symbol, das mit dem Symbol auf dem Diagramm übereinstimmt, an das ich den Indikator anhänge), es ist ok, aber die Indikatordaten für das zweite Symbol werden nicht empfangen ... D.h. es empfängt Daten nur für das Symbol, das mit dem Symbol auf dem Diagramm übereinstimmt, an das es angehängt ist ... was mache ich falsch?
 
FinEngineer:
Hallo! Ich habe versucht, einen Indikator zu erstellen, der 2 Symbole verwendet (z.B. EURUSD und GBPUSD), er zeichnet nicht (gibt einen Fehler 4806) ... Ich erhalte Indikator-Handles in der OnInit-Funktion (z.B. iRSI) jedes Symbols, ich kopiere Indikator-Daten in Puffer und führe weitere Operationen mit ihnen durch ...Es empfängt Indikatordaten für ein Symbol (das gleiche Symbol, das mit dem Symbol auf dem Diagramm übereinstimmt, an das ich den Indikator anhänge) es ist ok, aber Indikatordaten für das zweite Symbol werden nicht empfangen ... d.h., es empfängt Daten nur für das Symbol, das mit dem Symbol auf dem Diagramm übereinstimmt, an das der Indikator angehängt ist ... was mache ich falsch?
Zeigen Sie mir also den Teil des Codes, der das Problem verursacht hat.
 

Ich poste den ganzen Code, weil nichts funktioniert, auf mql4 war alles viel einfacher, vielleicht ist es nur, weil ich nicht daran gewöhnt bin... diese Handles und Hilfspuffer töten mein Gehirn.

Ich denke, die Bedeutung ist klar (Unterschied in rsi von 2 korrelierenden Symbolen), bitte helfen....point aus den Fehlern?

#property copyright "Copyright 2012, MetaQuotes Software Corp.
#property link "http://www.mql5.com"
#Eigenschaft Version "1.00"

//---- Indikator-Rendering-Eigenschaften
#Eigenschaft indicator_buffers 3
#property indicator_label1 "Pair_delta_RSI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 Rot
#property indicator_style1 STYLE_SOLID
#Eigenschaft indicator_width1 1
#Eigenschaft Eingabeparameter
input string Symbol1_Name = "EURUSD";
input string Symbol2_Name = "GBPUSD";
Eingabe int PeriodRSI=7;
Eingabe 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);//Indikator-Handles holen
RSI2_Handle=iRSI(Symbol2_Name,0,PeriodRSI,PRICE_CLOSE);
zurück(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 &Volumen[],
const int &Spread[])
{
int calculated=BarsCalculated(RSI1_Handle);
if(berechnet<Raten_Gesamt)
{
Print("Nicht alle Daten von RSI1_Handle sind berechnet (",calculated, "bars ). Fehler",GetLastError());
zurück(0);
}
berechnet=BarsCalculated(RSI2_Handle);
if(berechnet<Raten_Gesamt)
{
Print("Nicht alle Daten von RSI2_Handle sind berechnet (",calculated, "bars ). Fehler",GetLastError());
zurück(0);
}
//--- wir können nicht alle Daten kopieren
int to_copy;
if(vorher_berechnet>Tarife_Gesamt || vorher_berechnet<0) to_copy=Tarife_Gesamt;
sonst
{
to_copy=total-prev_calculated;
if(prev_calculated>0) to_copy++;
}
//Empfang des RSI1-Puffers
if(CopyBuffer(RSI1_Handle,0,0,to_copy,RSI1_Buffer)<=0)
{
Print("Das Abrufen von RSI1 ist fehlgeschlagen! Fehler",GetLastError());
zurück(0);
}
//Abrufen des RSI2-Puffers
if(CopyBuffer(RSI2_Handle,0,0,to_copy,RSI2_Buffer)<=0)
{
Print("Das Abrufen von RSI2 ist fehlgeschlagen! Fehler",GetLastError());
zurück(0);
}
//---
int-Grenze;
if(prev_calculated==0)
Grenze=0;
sonst limit=prev_calculated-1;
//delta rsi-indikator berechnen
for(int i=limit;i<rates_total; i++)
DeltaRSI_Puffer[i]=RSI1_Puffer[i]-RSI2_Puffer[i];
return(rates_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
 

Fehler Nr. 1

Nichtverwendung der SRC-Taste

 

Ein solcher Fehler tritt z. B. auf, wenn Sie einen benutzerdefinierten Standard-MACD-Indikator nehmen und die folgende Zeile ändern

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

zu

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

Wenn der MACD an ein EURUSD-Diagramm angehängt ist, wird alles gezeichnet, wenn er an ein anderes Diagramm angehängt ist, erscheint der Fehler 4806... Wie kann ich es so einrichten, dass ich in diesem Indikator so viele Symbole verwenden kann, wie ich möchte?

Wenn Sie mir sagen können, wie ich den zuvor geposteten Indikator zum Laufen bringen kann, wäre ich Ihnen sehr dankbar.

 
mario065:

Lester: Hier habe ich eine Vorlage eingefügt, in der sich eine Änderung befindet - ich habe Ihnen gezeigt, wie man krabbelt.

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

Wenn Sie das nicht wollen, müssen Sie die Variablen richtig zählen.

Ich habe die Idee der Schablon-Datei mit gemischtem Erfolg, brachte es auf meine Bedingungen ein wenig und es gesetzt Stops und Gewinne. Allerdings gibt es für mich eine bedeutende Blockade - sie werden auf die nächste Kerze gesetzt, nicht auf einen Tick. Hier ist der Teil des 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:

Mit mehr oder weniger Erfolg habe ich das Wesentliche der Schablon-Datei verstanden, sie ein wenig an meine Bedingungen angepasst und Hurra - Stopps und Gewinne sind gesetzt. Allerdings gibt es für mich eine bedeutende Blockade - sie werden auf die nächste Kerze gesetzt, nicht auf einen Tick. Hier ist ein Teil des Codes.

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);
           }
        }
      }
     } 
//===============================================

Der Code sollte immer Bedingungen für einige Aktionen enthalten, aber alles sollte überprüft werden und eine gewisse Logik haben.

Wenn Sie helfen wollen, drucken Sie(" ", ); ) und sehen Sie sich das Ergebnis an.

 
mario065:

Die Beschreibungen sind alle eindeutig und funktionieren. Dies ist jedoch eine Abwandlung von "breakeven" und "trailing". Ich sollte eine Modifikation schreiben, um StopLimit und TakeProfit nach Ordereröffnung zu setzen, d.h.

1. Auftragseröffnung

--------

2. Änderung der Haltelinie (diese ist noch nicht erreicht!)

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

------

3 Modifikation für Breakeven

4. die Änderung des Trailing-Stops

5. die Bestellung abschließen


Sie können Punkt 2 verwenden, um die Reihenfolge zu ändern, aber nur zu Beginn des nächsten Taktes.

 

Es wird eine Funktion zum Öffnen von eats geschrieben:

Сама функция(символ,обем,проскалзивание,стоп,тейк,магик)
С вызова функции можно все сразу поставит.
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);
           }
        }
      }
     } 
//=============================================== 
 
Gibt es irgendwelche MQL5-Entwickler in diesem Thread!? Habe ich eine Frage in der falschen Branche gestellt? Dann sagen Sie mir, wie ich eine Frage an die Entwickler stellen kann? Die obige Frage ist elementar für einen erfahrenen Programmierer...