[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 326

 

Ich bin kein Fan von Indikatoren, aber ich habe beschlossen, eine Sache zu überprüfen. Der Expert Advisor sollte zum Preis des oberen RSI-Indikators kaufen und zum Preis des unteren RSI-Indikators verkaufen. Nur wenn der Preis bereits über der oberen Grenze des RSI-Indikators, dann kaufen sollte über dieser Grenze und unter dem Wert dieser Grenze + einige Wert der Einrückung von der Grenze nach oben (in den Code habe ich nur eine Zahl 0,1), für den Verkauf, im Gegenteil.

Ich habe es so gemacht:

Externe Parameter:

extern string ___H1 = " __________ Параметры RSI _________ ";
extern int     i_RSITF = 5,
               i_RSIPeriod = 21,
               i_RSIApplied = PRICE_CLOSE;
extern double  i_RSIToUpLimit = 55,                                     // Верхняя граница RSI
               i_RSIToDnLimit = 45;                                     // Нижняя граница RSI

Code der Funktion, die das Signal empfängt, und der RSI-Wert selbst:(0,1 ist hier die Margentoleranz für den Bereich des Kaufs oder Verkaufs)

//+-------------------------------------------------------------------------------------+
//| Получаем RSI с заданными параметрами                                                |
//+-------------------------------------------------------------------------------------+
double GetRSI(int RSIIndex)
{
   return (iRSI(NULL, i_RSITF, i_RSIPeriod, i_RSIApplied, RSIIndex));
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   if (FindOrders() > 0)
       return (SIGNAL_NO);

 //  if (GetRSI(PRICE_CLOSE, 0) > GetRSI(PRICE_CLOSE, 1))
   if (GetRSI(0) > i_RSIToUpLimit)
      if (GetRSI(0) < (i_RSIToUpLimit + 0.1))
         return (SIGNAL_BUY);                  // Запускаем функцию открытия покупки
           
   if (GetRSI(0) < i_RSIToDnLimit)
      if (GetRSI(0) > (i_RSIToDnLimit - 0.1))
         return (SIGNAL_SELL);                // Запускаем функцию открытия продаж
   
   return (SIGNAL_NO);
}

Manchmal eröffnet der EA Orders auf dem gleichen Niveau, manchmal viel höher (zum Kaufen) und manchmal viel niedriger (zum Verkaufen). Und warum? Der Algorithmus ist elementar.

 
Hallo zusammen. Ich habe eine Frage. Ich habe mir einen Kopierer /**/ zugelegt, eine gute und praktische Sache, wenn man mit mehreren Konten arbeitet. Aber das Problem ist, dass, wenn man ein anderes Programm (Video, Spiel, nur Karten) parallel laufen lässt, ein ständiges Knacken aus den Lautsprechern kommt. Ist es möglich, das Problem (Klappern) zu beseitigen? Vielen Dank im Voraus.
 

Ich versuche, einen einfachen Indikator zu schreiben, der auf RSI basiert (das Analogon ist RandomIndicatorSignals mq4).

Ich versuche, einen einfachen Indikator auf RSI (für das Analogon dieses Indikators RandomIndicatorSignals.mq4 aus dem Artikel MQL4 Sprache für Dummies zu schreiben. Benutzerdefinierte Indikatoren (Teil 1)(https://www.mql5.com/ru/articles/1500).

Die Idee ist einfach: Wenn der RSI ein Hoch oder einen Tiefpunkt markiert, zeichnet er einen Pfeil auf dem Diagramm.

Es scheint in Ordnung zu sein, aber meiner Meinung nach wird der RSI-Wert-Puffer für jede Kerze nicht gefüllt, deshalb funktioniert es nicht. Hier ist der Code.

//+------------------------------------------------------------------+
//|                                                    RSI+Arrow.mq4 |
//|                                                         _______ |
//|                                                    |
//+------------------------------------------------------------------+
#property copyright "_______"
#property link      "_________"


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Crimson
#property indicator_color2 RoyalBlue
//---- input parameters
extern int       barsToProcess=500;
//---- buffers
double ExtMapBuffer1[],
       ExtMapBuffer2[],
       RSIBuffer3[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,236);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,238);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer (2,RSIBuffer3);
   // для информации о значениях буфера
   SetIndexLabel  (2,"RSIBuffer3");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {    
   //расчет индикатора на последних барах 
   int limit,i;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   if(limit>barsToProcess)
   limit=barsToProcess;
   
   //заполняем буфер RSI значениями 
   for(i=0; i<limit; i++)
   if(i>=1)
     {
       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,0);
     }       
  //проводим сравнения                        
   for(i=0; i<limit; i++)
   if(i>=1)
        
        {
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]>0 && RSIBuffer3[i+1]-RSIBuffer3[i]>0) // условия выставления стрелки 

        /* так тоже не работает
        if(RSIBuffer3[i+2]>=RSIBuffer3[i+1] && RSIBuffer3[i+1]<=RSIBuffer3[i])
        */
        
        ExtMapBuffer2[i]=Low[i]-5*Point;
                    
        else
           
        ExtMapBuffer2[i]=0.0;
               
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]<0 && RSIBuffer3[i+1]-RSIBuffer3[i]<0) // условия выставления стрелки
        
        /* так тоже не работает
        if(RSIBuffer3[i+2]<=RSIBuffer3[i+1] && RSIBuffer3[i+1]>=RSIBuffer3[i])
        */
              
        ExtMapBuffer1[i]=High[i]+5*Point;
           
        else      
           
        ExtMapBuffer1[i]=0.0;           
        }
                   
   return(0);
   }
        
//+------------------------------------------------------------------+      
 
Merincool:

Ich versuche, einen einfachen Indikator zu schreiben, der auf RSI basiert (das Analogon ist RandomIndicatorSignals mq4).

Ich versuche, einen einfachen Indikator auf RSI (für das Analogon dieses Indikators RandomIndicatorSignals.mq4 aus dem Artikel MQL4 Sprache für Dummies zu schreiben. Benutzerdefinierte Indikatoren (Teil 1)(https://www.mql5.com/ru/articles/1500).

Die Idee ist einfach: Wenn der RSI ein Hoch oder einen Tiefpunkt markiert, zeichnet er einen Pfeil auf dem Diagramm.

Es scheint in Ordnung zu sein, aber meiner Meinung nach wird der RSI-Wert-Puffer für jede Kerze nicht gefüllt, deshalb funktioniert es nicht. Hier ist der Code.

Sie greifen in einer Schleife auf nicht berechnete Indikatorwerte zu.

Ändern Sie

for(i=0; i<limit; i++)

zu

for(i=limit-1; i>=0; i--)
 
PapaYozh:

Sie kehren zu den nicht berechneten Indikatorwerten zurück.

Ändern Sie

zu


Danke, das hat mich auf eine Idee gebracht! Ich würde jedoch gerne die "physikalische Bedeutung" verstehen :) wie unser Physiker zu sagen pflegte

Ich habe selbst ein Problem: 2 "leicht" unterschiedliche, aber im Wesentlichen gleiche Aktionscodes: ALLE ausstehenden Aufträge löschen

1) funktioniert nicht richtig - nur ein Auftrag wird gelöscht

void start()

  {

   bool   result;     int    cmd,total,OT;

   total=OrdersTotal();

   for(int i=0; i<total; i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

        {

         cmd=OrderType();    OT=OrderTicket();

         if(cmd>1)   // !=OP_BUY && cmd!=OP_SELL)

           {

            result=OrderDelete(OT);

           }

        }

     } //end FOR

  }

2) Es funktioniert gut - alle werden gelöscht

void start()
{
    string msg="Удалить все отложенные ордера?    ";
//   if (MessageBox(msg,title,MB_YESNO|MB_ICONQUESTION)!=IDYES) return;

   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()>1) OrderDelete(OrderTicket());
   }
}

Erläutern Sie bitte die Bedeutung von "in dieser Schleife greifen Sie auf die nicht berechneten Werte des Indikators zu".

 
PapaYozh:

Sie kehren zu den nicht berechneten Indikatorwerten zurück.

Ändern Sie

zu


Können Sie es buchstabieren? Warum? Damit ich in Zukunft keine Fehler mehr mache.
 
PapaYozh:

Sie kehren zu den nicht berechneten Indikatorwerten zurück.

Ändern Sie

zu


funktioniert immer noch nicht, RSIBuffer3 zeigt nur den RSI-Wert des letzten Balkens an, wenn man den Mauszeiger über einen Balken bewegt
 
Merincool:

Und es funktioniert immer noch nicht, RSIBuffer3 zeigt nur den RSI-Wert des letzten Balkens an, wenn man den Mauszeiger über den Balken bewegt

Ihr 5. Parameter ist 0 - also der letzte Takt!

machen Sie es so:

       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,i);  

Auszug aus dem Dokument:

double iRSI( string symbol, int timeframe, int period, int applied_price, int shift)
Berechnet den Index der relativen Stärke und gibt seinen Wert zurück.
Parameter:
Symbol - Symbol, dessen Daten zur Berechnung des Indikators verwendet werden sollen. NULL bedeutet das aktuelle Symbol.
Zeitrahmen - Zeitrahmen. Es kann ein beliebiger Wert der Aufzählung Timeframe sein. 0 bedeutet den aktuellen Chart-Zeitrahmen.
Zeitraum - Anzahl der Perioden für die Berechnung.
angewandter_Preis - Angewandter Preis. Es kann ein beliebiger Wert aus der Aufzählung der angewandten Preise sein.
Schicht - Index des aus dem Indikatorpuffer entnommenen Wertes (Verschiebung relativ zum aktuellen Balken um die angegebene Anzahl von Perioden).
 
PapaYozh:

Sie kehren zu den nicht berechneten Indikatorwerten zurück.

Ändern Sie

zu


Und was ich auch dachte, nach Ihrer Logik sollte das Tool den RSI vom Limit und bis zum 0-Bar berechnen, aber macht es einen Unterschied, welche Seite den RSI vom Ende oder vom Anfang berechnen sollte? Es sollte den RSI für jeden Bar in einem bestimmten Bereich berechnen und den Wert in einen Puffer (ich meine in ein Array) legen, und dann einfach drei aufeinanderfolgende Werte in einem Array miteinander vergleichen. Oder ist es nicht so?

 
amurik61:

Ihr 5. Parameter ist 0 - also der letzte Takt!

machen Sie es so:

Auszug aus dem Dokument:

double iRSI( string symbol, int timeframe, int period, int applied_price, int shift)
Berechnet den Index der relativen Stärke und gibt seinen Wert zurück.
Parameter:
Symbol - Symbol, dessen Daten zur Berechnung des Indikators verwendet werden sollen. NULL bedeutet das aktuelle Symbol.
Zeitrahmen - Zeitrahmen. Es kann ein beliebiger Wert der Aufzählung Timeframe sein. 0 bedeutet den aktuellen Chart-Zeitrahmen.
Zeitraum - Anzahl der Perioden für die Berechnung.
angewandter_Preis - Angewandter Preis. Es kann ein beliebiger Wert aus der Aufzählung der angewandten Preise sein.
Schicht - Index des aus dem Indikatorpuffer entnommenen Wertes (Verschiebung relativ zum aktuellen Balken um die angegebene Zeitspanne).

Ich werde es ausprobieren, danke
Grund der Beschwerde: