[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 227

 

Ich möchte eine Funktion in meinen EA einbauen, die in der hinteren Ecke des Bildschirms eine Benachrichtigung über den aktuellen Trend auf verschiedenen Zeitrahmen und die bevorstehende Umkehrung anzeigt. Ich verwende zu diesem Zweck die Funktionen LinearRegression und Diverg, habe aber noch nie mit der FunktionComment gearbeitet und kann daher nicht verstehen, wo ich einen Fehler gemacht habe. Wie auch immer, der unten stehende Code zeigt nur die "Trend W = Down"-Meldung an, aber ich möchte, dass er auch Informationen für alle anderen TFs anzeigt.

void UPDN ()
{
if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diver_Per_H1, 0) < 0) Comment("Trend H1 = Up");
if(Diverg(LR_TFr_1,0,Diver_Per_H1)<0) Comment("...!Pivot auf H1 = Down");
if(LinearRegression(Symbol( ), LR_TFr_2, 0, Diver_Per_H4, 0) < 0) Comment("Trend H4 = Up");
if(Diverg(LR_TFr_2,0,Diver_Per_H4)<0) Comment("...!Pivot auf H4 = Down");
if(LinearRegression(Symbol( ), LR_TFr_3, 0, Diver_Per_D1, 0) < 0) Comment("Trend D1 = Up");
if(Diverg(LR_TFr_3,0,Diver_Per_D1)<0) Comment("..!Pivot auf D1 = Down");
if(LinearRegression(Symbol( ), LR_TFr_4, 0, Diver_Per_W, 0) < 0) Comment("Trend W = Up");
if(Diverg(LR_TFr_4,0,Diver_Per_W)<0) Comment("...!Pivot nach W = Down");

if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diver_Per_H1, 0) > 0) Comment("Trend H1 = Down");
if(Diverg(LR_TFr_1,0,Diver_Per_H1)>0) Comment("...!Pivot auf H1 = Up");
if(LinearRegression(Symbol( ), LR_TFr_2, 0, Diver_Per_H4, 0) > 0) Comment("Trend H4 = Down");
if(Diverg(LR_TFr_2,0,Diver_Per_H4)>0) Comment("...!Pivot auf H4 = Up");
if(LinearRegression(Symbol( ), LR_TFr_3, 0, Diver_Per_D1, 0) > 0) Comment("Trend D1 = Down");
if(Diverg(LR_TFr_3,0,Diver_Per_D1)>0) Comment("...!Pivot auf D1 = Up");
if(LinearRegression(Symbol( ), LR_TFr_4, 0, Diver_Per_W, 0) > 0) Comment("Trend W = Down");
if(Diverg(LR_TFr_4,0,Diver_Per_W)>0) Comment("....W = Up");
return(0);
}

 
Optim:

Liebe Kollegen-Profis, ich brauche eure Hilfe: Ich möchte in meinem EA eine Funktion einbauen, die in der hinteren Ecke des Bildschirms eine Benachrichtigung über den aktuellen Trend auf verschiedenen Timeframes und die bevorstehende Umkehrung anzeigt. Ich verwende zu diesem Zweck meine Funktionen LinearRegression und Diverg, habe aber noch nie mit der Funktion Comment gearbeitet und kann daher nicht verstehen, wo ich einen Fehler gemacht habe. Wie auch immer, der folgende Code zeigt nur die Meldung "Trend W = Down" an, aber ich möchte, dass er mich über andere TFs informiert.

void UPDN ()
{
if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diverg_Per_H1, 0) < 0) Comment("Trend H1 = Up")
if(Diverg(LR_TFr_1,0,Diver_Per_H1)<0) Comment("...!Turn at H1 = Down");
if(LinearRegression(Symbol( ), LR_TFr_2, 0, Diverg_Per_H4, 0) < 0) Comment("Trend H4 = Up")
if(Diverg(LR_TFr_2,0,Diver_Per_H4)<0) Comment("...!H4 Trendumkehr = Down")
if(LinearRegression(Symbol( ), LR_TFr_3, 0, Diver_Per_D1, 0) < 0) Comment("Trend D1 = Up")
if(Diverg(LR_TFr_3,0,Diver_Per_D1)<0) Comment("...!Pivot auf D1 = Down");
if(LinearRegression(Symbol( ), LR_TFr_4, 0, Diver_Per_W, 0) < 0) Comment("Trend W = Up");
if(Diverg(LR_TFr_4,0,Diver_Per_W)<0) Comment(";)

if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diverg_Per_H1, 0) > 0) Comment("Trend H1 = Down")
if(Diverg(LR_TFr_1,0,Diver_Per_H1)>0) Comment("...!H1 Trendumkehr = Up");
if(LinearRegression(Symbol( ), LR_TFr_2, 0, Diver_Per_H4, 0) > 0) Comment("Trend H4 = Down")
if(Diverg(LR_TFr_2,0,Diver_Per_H4)>0) Comment("...!H4 Trendumkehr = Up");
if(LinearRegression(Symbol( ), LR_TFr_3, 0, Diver_Per_D1, 0) > 0) Comment("Trend D1 = Abwärts")
if(Diverg(LR_TFr_3,0,Diver_Per_D1)>0) Comment("...!Pivot auf D1 = Up");
if(LinearRegression(Symbol( ), LR_TFr_4, 0, Diver_Per_W, 0) > 0) Comment("Trend W = Down");
if(Diverg(LR_TFr_4,0,Diver_Per_W)>0) Comment("...!Diverg to W = Up")
zurück(0);
}


voidKommentar(...)
Die Funktion gibt einen benutzerdefinierten Kommentar in der oberen linken Ecke des Diagramms aus. Die Parameter können von beliebigem Typ sein. Die Anzahl der Parameter darf 64 nicht überschreiten.

Arrays können nicht an Comment() übergeben werden. Arrays müssen Element für Element gedruckt werden.

Daten vom Typ Double werden mit 4 Dezimalstellen nach dem Punkt ausgegeben. Um Zahlen mit höherer Genauigkeit zu drucken, verwenden Sie die FunktionDoubleToStr().
Die Typen bool, datetime und color werden als Zahlen gedruckt.
Um Datumsdaten als String auszugeben, verwenden Sie die FunktionTimeToStr().

Um die Ausgabe in mehrere Zeilen aufzuteilen, können Sie das Zeilenvorschubzeichen "\n" oder "\r\n" verwenden.
Siehe auchAlert() undPrint().
Parameter:
...-Beliebige Werte, durch Kommata getrennt.
Beispiel:
 double free=AccountFreeMargin(); Comment("Account free margin is ",DoubleToStr(free,2),"\n", "Current time is ",TimeToStr(TimeCurrent());
 
Lesen Sie wenigstens die Dokumentation, bevor Sie Fragen stellen. Die Hälfte der Antworten ist schon da
 

Danke, ich habe es verstanden. Ich muss Variablen entsprechend den Ergebnissen der Funktionen LinearRegression und Diverg für jede TF eingeben und sie dann mit einem Kommentar ausgeben, kann in mehreren Zeilen sein.

 
Optim:

Danke, ich habe es verstanden. Ich muss Variablen entsprechend den Ergebnissen der Funktionen LinearRegression und Diverg für jede TF eingeben und sie dann mit einem Kommentar ausgeben, kann in mehreren Zeilen sein.


Es gibt nur eine Beschränkung in Bezug auf die Zeilenlänge. Sie können die Funktion von Alexander Pak verwenden. Wenn Sie es nicht finden können, werde ich selbst danach suchen.
 

Sehr geehrte Damen und Herren!

Ich habe eine Frage zur Übergabe eines Arrays per Referenz.

Der Algorithmus ist wie folgt aufgebaut:

Wir übergeben ein Array per Referenz von einer Bibliothek an eine andere.

Wir kopieren sie mit der eingebauten Funktion dorthin:

ArrayCopy.

Als nächstes wird das als Referenz übergebene Array verwendet

im ersten Modul.

Aber aus irgendeinem Grund tritt ein Fehler auf, und zwar nicht immer.

D.h. manchmal wird das Array kopiert, manchmal nicht.

Was ist der Grund dafür?

Der Protokolleintrag lautet wie folgt:

21:07:12 openHistory CADCHF,H1:

2 Arraybereiche für die ArrayCopy-Funktion (0 und 4)

Anschließen des Moduls

Kopieren

 
Roger:
Das liegt daran, dass Sie mein Beispiel falsch kopiert haben. Schauen Sie genau hin, wo das i und wo das k steht.

Ich habe den Code entsprechend dem Ihren korrigiert.
Beim Test wurden vier Aufträge in der Reihenfolge geschlossen, in der sie beim ersten Tick gesetzt wurden, der fünfte wurde beim nächsten Tick geschlossen. Wahrscheinlich ist hier etwas anderes falsch, denn ich habe es mehrmals getestet.
Ich stelle Ihnen den Code des Programms und die Protokolle des Testers zur Verfügung.
Mit freundlichen Grüßen. Shurkin

Код программы.
//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                                            21 февраля 2013 года. |
//|Тестирование оператора цикла for.                                 |
//+------------------------------------------------------------------+
#property copyright "21 февраля 2013 года."
#property link      ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn=357;//Magic number
int i;//Показатель счётчика итераций
double PriTP;//TP серии
int Tick;//Счётчик тиков
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----Установка серии ордеров
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,NormalizeDouble(Bid-35*Point,Digits),
NormalizeDouble(Ask+35*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1,Ask,0,NormalizeDouble(Bid-25*Point,Digits),
NormalizeDouble(Ask+25*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUYLIMIT,1,NormalizeDouble(Ask-15*Point,Digits),0,
NormalizeDouble(Bid-40*Point,Digits),NormalizeDouble(Ask+25*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_BUYLIMIT
OrderSend(Symbol(),OP_SELLSTOP,3,NormalizeDouble(Ask-30*Point,Digits),0,
NormalizeDouble(Bid+15*Point,Digits),NormalizeDouble(Ask-75*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_SELLSTOP
//----
   PriTP=Bid;//PriTP
   Print("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Tick++;//Tick
//   Print("Кс0:"," Tick=",Tick);//Сообщение
//----
//   for(i=0;i<OrdersTotal();i++)//Инициализация цикла
//   for(i=OrdersTotal()-1; i>=0; i--)//
   for(i=0, int k=0; i<OrdersTotal();i++,k++)//
   {
   Print("Кс1:"," Tick=",Tick," i=",i," k=",k);//Сообщение
   if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера k
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
   k--;//?
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0, int k=0; i<OrdersTotal();i++,k++)
/*   
   for(i=0, int k=0; i<OrdersTotal();i++,k++)//
   {
   Print("Кс1:"," Tick=",Tick," i=",i," k=",k);//Сообщение
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
   k--;//Зачем сначала прибавлять и тут же убавлять ???
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
*/   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Записи в журнале тестера.
2013.03.18 13:58:21     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=4 i=1 k=1
2013.03.18 13:58:21     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=4 i=0 k=0
2013.03.18 13:57:57     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=3 i=1 k=1
2013.03.18 13:57:57     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=3 i=0 k=0
2013.03.18 13:57:33     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=2 i=1 k=0
2013.03.18 13:57:33     2013.02.11 12:15  Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3394
2013.03.18 13:57:33     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=2 i=0 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=3 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=2 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=1 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=0 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ0: OrdersTotal=7
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok
2013.03.18 13:57:09     Poligon1 test started
2013.03.18 13:57:02     Poligon1 EURUSD,M15: loaded successfully
 
Wo ist die beste Stelle für die Deklaration eines Variablentyps (int, double usw.) im Hinblick auf die Verringerung des Ressourcenverbrauchs bei der Programmausführung? Zum Beispiel kann int i global oder in int start() deklariert werden ... for (int i=OrdersTotal()-1; i>=0; i--) ... Ich habe das Gefühl, dass die Deklaration bei jedem Tick kostspieliger ist als die einmalige Deklaration auf globaler Ebene, direkt nach externen Parametern. Oder ist der Unterschied in der Ressourcenintensität derselbe?
 
Zhunko:
Sie müssen den Start wiederholen. Arbeiten Sie innerhalb der Schleife. Dort kann man alles machen.

Wenn die Verbindung unterbrochen wird, steht im Protokoll "Ping fehlgeschlagen". Das bedeutet, dass es zwar eine Verbindung gibt, diese aber aus irgendeinem Grund nicht dokumentiert ist.
Wie hoch ist die Belastung von CPU und Speicher durch die Schleifenbildung?

 
Dimka-novitsek:

Guten Abend! Entschuldigen Sie mich, ich möchte auf ein ungelöstes Problem zurückkommen.

'Kaufen' - inkompatible Typen D:\TeleTRADE\experts/experts/clean.mq4 (102, 53)

'Sell' - inkompatible Typen D:\TeleTRADE\experts\clearlist.mq4 (102, 79)


if (!Pishem&&PozyProstavleny){SaveArray(FileBuy, Buy); SaveArray(FileSell, Sell); Pishem=1;}

Diese Zeile lässt sich nicht kompilieren.