Frage für Kenner - Seite 2

 

Ich habe hier eine Variante des Codes gefunden.

wie er in meinen EA???????????? eingefügt werden kann

//+----------------------------------------------------------------------------+
//|  Возвращает номер бара открытия последней позиции или -1.                  |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    tf  - таймфрейм                 ( 0 - текущий таймфрейм)                |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) {
  datetime oot;
  int      i, k=OrdersTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (oot<OrderOpenTime()) oot=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sym, tf, oot, True));
}
 
Kostay:

Die seltsame Sache ist los mit dem Expert Advisor jetzt. es ist nicht mit der Position Schließungen arbeiten. es kann mehrere Positionen des gleichen Typs offen und aktiv zur gleichen Zeit sein. Und das Ergebnis: alles verliert an demselben Problem, wenn auch in einer veränderten Version!

Repariert, probieren Sie es aus.

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start() {
   double P_up0,P_down0,P_up1,P_down1;
   double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
   int i, cnt, ticket, total;
   bool flag=true;

   if(Bars<100) {
      Print("bars less than 100");
      return(0); 
   }
// Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   
//-----------------------------------------------
   P_up0=iCustom(0,0,"Ценовой канал",11,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",11,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",11,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",11,1,1);
   st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
   st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
   st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
   st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
   Pivot=iCustom(0,0,"Pivot",0,1);
   ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//задали все данные 

// Проверка свободной маржи
   if(AccountFreeMargin()<(1000*Lots)) {
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0); 
   }
   total=OrdersTotal();
// Условие открытие позиции BUY
   if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1) {
      if((total>0) || (!flag)) return(0);
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
      
// Условие открытие позиции SELL
   if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1) {
      if((total>0) || (!flag)) return(0);
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
  
   for(i=cnt;i>=0;i--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
         if(OrderType()==OP_BUY) {// длинная позиция открыта
// условие закрытие длинной позиции
            if(P_down1>P_down0) {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
               return(0); 
            }
         }  else {
// условие закрытия короткой позиции
               if(P_up1<P_up0) {
                  OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
                  return(0); 
               }
            }
      }
   }
   return(0);
}
 

Hallo.

Bei der Programmierung eines neuronalen Netzes bin ich auf das folgende Problem gestoßen.

Ich habe ein Array:

double X[3];
   X[0]=1;
   X[1]=2;
   X[2]=3;
   X[3]=4;

Comment(X[3]);

Wenn ich es teste, erhalte ich 0 statt 4. Das Gleiche gilt für ein zweidimensionales Array, was sollte ich tun?

Und die Gelegenheit nutzen, um eine zweite Frage zu stellen: wie ich verstehe, kann mql4 nicht einen bestimmten Bereich für die Zuweisung einer Variablen zu Zufallszahlen festlegen?

In Delphi sieht das folgendermaßen aus

Randomisieren;

i:=Random(10); // der gleiche Bereich von 0 bis 10

 
Chris_Brown >> :

...ich habe ein Array:

Beim Testen erhalte ich 0 anstelle von 4. Dasselbe passiert in einem zweidimensionalen Array, was kann ich tun?

Das Array ist einfach: Sie definieren die Dimension [3] und rufen die vierte fehlende Zelle auf.

Schreiben Sie double X[4]; und alles wird funktionieren.

 
granit77 >> :

Bei einem Array ist es ganz einfach: Sie haben die Dimension [3] definiert und rufen die vierte, fehlende Zelle auf.

Schreiben Sie double X[4]; und alles wird funktionieren.

Danke, ich werde es ausprobieren, aber was ist mit dem Zufallsprinzip?

 

Und wenn es sich um ein zweidimensionales Array handelt, eine 4 x 9-Matrix, und jedem Element ein Wert von 0,1 zugewiesen wird, wäre das ungefähr richtig?


int i, j;

double W[4][9];
   for ( i=0; i<=3; i++)
   for ( j=0; j<=8; j++)
       W[ i][ j]=0.1; 
 
Chris_Brown >> :

Und wenn Sie ein zweidimensionales Array haben, eine Matrix von 4 mal 9, und jedem Element den Wert 0,1 zuweisen, sieht es dann so aus?

Es sollte funktionieren. Wenn Sie nicht zu faul sind und die gesamte Matrix Zeile für Zeile im Kommentar anzeigen, sehen Sie das Ergebnis.

Übrigens können Sie den Kommentar zu einer Funktion machen und damit den Inhalt des Arrays überprüfen.

Und was die Zufälligkeit angeht: Ich verzichte. Ich bin gerade vorbeigekommen und habe den Fehler gesehen. :))

 
Chris_Brown писал(а) >>

Danke, ich werde es ausprobieren, aber was ist mit dem Zufallsprinzip?

double i=MathRand()/32767.0*10; 
die Hilfe ist da drin.
 
Chris_Brown писал(а) >>

Und wenn es ein zweidimensionales Array gibt, eine 4-mal-9-Matrix, und jedem Element ein Wert von 0,1 zugewiesen wird, würde es dann etwa so aussehen?

Kann verwendet werden

int ArrayInitialize( double &array[], double value)
Setzt alle Elemente eines numerischen Arrays auf denselben Wert. Gibt die Anzahl der initialisierten Elemente zurück.

 
Chris_Brown писал(а) >>

Und wenn Sie ein zweidimensionales Array haben, eine 4-mal-9-Matrix, und jedem Element einen Wert von 0,1 zuweisen, würde es dann so funktionieren?

int i, j;

double W[4][9];
   for ( i=0; i<=3; i++)
   for ( j=0; j<=8; j++)
       W[ i][ j]=0.1; 

Es würde funktionieren, aber es sollte so geschrieben werden:

int i, j;

double W[4][9];

   for ( i=0; i<4; i++)
      for ( j=0; j<9; j++)
         W[ i][ j]=0.1; 
Grund der Beschwerde: