Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 971

 
korobok777:
Das kann man ohne den Code nicht sagen.
 

Nachmittags. Ich habe einen einfachen Indikator für den RSI-Ausstieg aus überkauften/überverkauften Zonen geschrieben.

rechts, zeichnet Pfeile dorthin, wo es sein soll. Aber nur in Echtzeit.

Frage: Wie kann man die Historie für eine Anzahl von n Balken anzeigen lassen?

#property indicator_chart_window
#Eigenschaft indicator_buffers 2
#property indicator_color1 LimeGreen
#property indicator_color2 LimeGreen

double rsi,rsi1,rsi2;
double CrossUp[];
double CrossDown[];
int FLAG = 0;
int FLAG1 = 2;
bool New_Bar=false;
int init()
{
//---- Indikatoren
SetIndexStyle(0, DRAW_ARROW,5,1);
SetIndexPfeil(0, 233);
SetIndexPuffer(0, CrossUp);
SetIndexStyle(1, DRAW_ARROW,5,1);
SetIndexArrow(1, 234);
SetIndexBuffer(1, CrossDown);
//----
zurück(0);
}
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Deinitialisierungsfunktion |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
zurück(0);
}
int start()
{

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0);
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1);
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2);



Fun_New_Bar();
int limit, i, counter;
double Range, AvgRange;
for(i = 0; i <= limit; i++) {
Zähler=i;
Bereich=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[Zähler]-Low[Zähler]);
}
Bereich=AvgRange/10;
if (FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
{Alert ("RSI DOWN!!! auf ", Symbol());
CrossDown[i] = Hoch[i]+ Bereich*1,8;
FLAG = 1;}
if(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
{Alert ("RSI UP!!! auf ", Symbol());
CrossUp[i] = Low[i]- Range*1.8;
FLAG1 = 1; }
if( Neuer_Balken==true)
{FLAG=0;}
if( Neuer_Balken==true)
{FLAG1=2;}
}
zurück(0);
}
void Fun_New_Bar()
{
static datetime New_Time=0;
Neuer_Balken=false;
if(Neue_Zeit!=Zeit[0])
{
Neue_Zeit=Zeit[0];
Neuer_Balken=true;
}
}
 
Vinin:
Ohne den Code kann man nichts sagen.
//==================================================================+
extern ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков
//==================================================================+

string _ChartSymbol;
long   _ChartID,
       _ChartFirst,
       _ChartPeriod;
int start()
{//---идентификатор графика начиная с первого 
    _ChartFirst=ChartFirst();
if(_ChartFirst>0)//если идентификатор больше ноля
{
 _ChartSymbol=ChartSymbol(_ChartFirst);//символ графика
 _ChartPeriod=ChartPeriod(_ChartFirst);//Периоды графика
 //---выполним функцию конвертации периода если не совпадает
if( _ChartPeriod!=PERIOD_)
 {
  bool  ch=ChartSetSymbolPeriod(_ChartFirst,_ChartSymbol,PERIOD_);
 } 
}
return(0);
}
int  deinit()
{
Alert("скрипт закончил работу");
return(0);
}
Das gilt nur für das erste Diagramm, weiter habe ich es nicht gemacht, das Pop-up-Fenster verhindert es.
 
Red_Manticore:

Nachmittags. Ich habe einen einfachen Indikator für den RSI-Ausstieg aus überkauften/überverkauften Zonen geschrieben.

rechts, zeichnet Pfeile dorthin, wo es sein soll. Aber nur in Echtzeit.

Frage: Wie kann man die Historie für eine Anzahl von n Balken anzeigen lassen?


Fügen Sie den Code nach den Regelnein, machen Sie sich vorher damit vertraut! Klicken Sie auf den SRC links neben der Videotaste und löschen Sie das "Blatt"!

#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 LimeGreen
#property  indicator_color2 LimeGreen

double rsi,rsi1,rsi2;
double CrossUp[];
double CrossDown[];
int FLAG = 0;
int FLAG1 = 2;
bool New_Bar=false; 
 
int init()
  {
//---- indicators
  SetIndexStyle(0, DRAW_ARROW,5,1);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW,5,1);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
int start()
{  

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0);
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1);
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2);



Fun_New_Bar(); 
  
   int limit, i, counter;
   double Range, AvgRange;
    for(i = 0; i <= limit; i++) {
   
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;
      if (FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
      {Alert ("RSI DOWN!!! on ", Symbol());
      CrossDown[i] = High[i]+ Range*1.8;
          FLAG = 1;} 
      if(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
      {Alert ("RSI UP!!! on ", Symbol());
      CrossUp[i] = Low[i]- Range*1.8;
         FLAG1 = 1; } 
   
       if( New_Bar==true)
       {FLAG=0;}
       if( New_Bar==true)
       {FLAG1=2;} 
   
   }
  return(0);
  } 
  
  void Fun_New_Bar()                              
  {                                             
   static datetime New_Time=0;                  
   New_Bar=false;                               
   if(New_Time!=Time[0])                        
     { 
      New_Time=Time[0];                         
      New_Bar=true;                            
     } 
  }     
ответить
 
korobok777:
Dies gilt nur für das erste Diagramm, weitere Eingriffe in das Pop-up-Fenster habe ich nicht vorgenommen.

Das Skript verarbeitet alle geöffneten Diagramme. Die aktuelle wird zuletzt bearbeitet. Da Skripte ihre Arbeit beenden, wenn sie den Zeitrahmen ändern, wird das Fenster, das vor der Beendigung des Skripts warnt, nur einmal eingeblendet. In allen Diagrammen wird der Zeitrahmen durch den angegebenen Zeitrahmen ersetzt.

//+------------------------------------------------------------------+
//|                                             ReplaceTimeFrame.mq4 |
//|                                            Copyright 2015, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict

#property  show_inputs

input ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   long id=ChartFirst();
   long id_current=ChartID();
   int i=0;
   while(i<100)
     {
      ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id);//Периоды графика
      if(_ChartPeriod!=PERIOD_ && id!=id_current)
        {
         bool  ch=ChartSetSymbolPeriod(id,ChartSymbol(id),PERIOD_);
        }

      id=ChartNext(id);
      if(id<0){break;}
      i++;
     }
   ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id_current);//Периоды графика
   if(_ChartPeriod!=PERIOD_)
     {
      bool  ch=ChartSetSymbolPeriod(id_current,ChartSymbol(id_current),PERIOD_);
     }
  }
 
Vinin:

Das Skript verarbeitet alle geöffneten Charts. Die aktuelle wird zuletzt bearbeitet. Da Skripte ihre Arbeit beenden, wenn sie den Zeitrahmen ändern, wird das Fenster, das vor der Beendigung des Skripts warnt, nur einmal eingeblendet. In allen Diagrammen wird der Zeitrahmen auf den angegebenen Zeitrahmen geändert.


Ai)))gut gemacht!!!!Dankeschön!!!
 

Guten Tag,

Ich deklariere ein Array

double gdClose_array[];

ArrayResize(gdClose_array, 1);

Kopieren der Daten in das Array mit dem letzten geschlossenen Balken, aus dem aktuellen Chart

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

Ausgabewert des Arrays

double dX=NormalizeDouble(gdClose_array[0],Digits);

Print ("NormalizeDouble(dX,Digits) ", dX);

Ich erhalte eine Zahl, aber die ist offensichtlich falsch:

NormalizeDouble(dX,Digits) 1.0644.

Obwohl es keinen solchen Wert im Diagramm gibt (gemäß der Visualisierung)

Und dieser Wert ändert sich im Laufe der Prüfung nicht.

Ich fügte hinzu

ArraySetAsSeries(gdClose_array,true);

Die Situation hat sich nicht geändert.

Wo liegt der Fehler?

 
n0name:

Nachmittags,

...

Kopieren von Daten in ein Array mit einem Abschluss durch den letzten geschlossenen Balken, aus dem aktuellen Chart

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

Hier haben Sie nur den Namen des Arrays geschrieben, ohne den Index des Arrayelements anzugeben. Da Sie zuvor ArrayResize(gdClose_array, 1); die Anzahl der Array-Elemente auf 1 gesetzt haben, ist sein Index 0. Deshalb muss es auf diese Weise gemacht werden:

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);


Und noch ein paar Fragen/Tipps.

1) Wenn Sie nur einen Wert speichern müssen, können Sie eine Variable anstelle eines Arrays verwenden. Dann anstelle von:

double gdClose_array[];
ArrayResize(gdClose_array, 1); 

machen.

double gdClose_array;

und führen Sie den Rest wie Ihren ursprünglichen Code aus.

2) Wenn Sie ein Array benötigen, aber sofort wissen, dass es nur 1 Element haben wird, dann deklarieren Sie ein statisches Array mit 1 Element, anstatt ein dynamisches zu deklarieren und dann die Größe zu ändern. Es besteht keine Notwendigkeit für zusätzliche Operationen.

Anstelle von

double gdClose_array[];
ArrayResize(gdClose_array, 1);

schreiben.

double gdClose_array[1];

dann

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);

und dann wie Ihr ursprünglicher Code.

 

Hallo, Frage an die Programmierer.

Ich habe einen Expert Advisor, der ausgelöst wird, wenn eine Order eröffnet wird, und der einen Stop-Loss und einen Take-Profit entsprechend einer bestimmten Anzahl von Punkten darauf setzt.

Meine Frage.

Können wir den Code so ändern, dass der EA anstelle des Stop-Loss einen ausstehenden umgekehrten Stop-Auftrag in derselben Größe ausgibt?

Was muss ich dafür im Code ändern?

Ich danke Ihnen.

 

Guten Tag!

Wieder kann ich nicht verstehen, was eine elementare Sache zu sein scheint - warum scheint alles gemäß der Hilfe zu sein, aber das Ergebnis druckt 0,0 ?

  double FractalDown_1 = iFractals(NULL,0,MODE_LOWER,1); Print("FractalDown_1=",FractalDown_1);

Warum wird der fraktale Wert nicht extrahiert?