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

 
Atlis:

Guten Tag.

Bitte teilen Sie uns mit, wie das Folgende umgesetzt werden kann:

Der Preis bewegt sich zwischen 1,9047 und 1,9080 (Zahlen sind willkürlich). Wenn sich der Eröffnungskurs der nächsten Kerze aus diesem Bereich herausbewegt - geben Sie einen Alarm aus. Wenn nicht, warten Sie auf die nächste Kerze. Und so weiter, bis der Preis die Spanne verlässt.

Ich danke Ihnen im Voraus.


   if (Open[0]<1.9047) Alert("Цена ниже заданного диапазона");
   if (Open[0]>1.9080) Alert("Цена выше заданного диапазона");
Dies ist nur ein Konzept. Wenn die Bedingung erfüllt ist, wird bei jedem Tick ein Alarm ausgelöst.
 

Hier ist ein Stück Code, dessen Daten dann für die Analyse verwendet werden:

   if (CurTime() == tm2)              //tm1 и tm2 - заданное время
   {
   //ObjectCreate("line2",OBJ_VLINE,0,tm1,0);
   price1=iHigh(Symbol(),PERIOD_M30,1);
   //ObjectCreate("highLine",OBJ_HLINE,0,0,price1);
   price2=iLow(Symbol(),PERIOD_M30,1);
   //ObjectCreate("lowLine",OBJ_HLINE,0,0,price2);
   Alert("price1=",price1);
   Alert("price2=",price2);
   }

d.h. weiter wird der Code wie folgt aussehen:

 if (Open[0]<price2) Alert("Цена ниже заданного диапазона");
 if (Open[0]>price1) Alert("Цена выше заданного диапазона");

Und hier stellt sich die Frage: Wie und wo sollen wir sie unterbringen? Innerhalb der Bedingung werden keine Warnmeldungen gedruckt, außerhalb der Bedingung werden die Warnmeldungen bei jedem Tick gedruckt.

Ich entschuldige mich für meine falsch formulierte Frage.

 
Atlis:

Hier ist ein Stück Code, dessen Daten dann für die Analyse verwendet werden:

d.h. weiter wird der Code wie folgt aussehen:

Und hier stellt sich die Frage: Wie und wo sollen wir sie unterbringen? Innerhalb der Bedingung werden keine Warnmeldungen gedruckt, außerhalb der Bedingung werden die Warnmeldungen bei jedem Tick gedruckt.

Ich entschuldige mich für meine falsch formulierte Frage.

Wenn Sie die Zeitprüfungsbedingung einfügen, werden die Preiswarnungen nur angezeigt, wenn der Preis außerhalb der Bereichsgrenzen liegt.
 
Danke, ich glaube, ich habe das Problem gelöst. Aber noch eine Frage: Jetzt werden die Alarme ab einem bestimmten Zeitintervall und bei Überschreitung des Bereichs bis "Stop" ausgegeben. Gibt es eine Möglichkeit, diese "Suche" zu beenden, wenn der erste Wert die Bedingung erfüllt?
 
Atlis:
Danke, ich habe das Problem gelöst. Hier eine weitere Frage: Die Alarme werden nun ab einem bestimmten Zeitintervall und bei Überschreitung des Bereichs bis zum "Stop" generiert. Gibt es eine Möglichkeit, diese "Suche" zu beenden, wenn der erste Wert die Bedingung erfüllt?

Nun, Sie müssen die wichtigste Bedingung verstehen, die immer und über einen bestimmten Zeitraum hinweg gilt. Zum Beispiel der Vergleich von Zeiten. Nachdem Sie alle Warnungen ausgegeben haben, müssen Sie der Variablen, mit der Sie die aktuelle Zeit vergleichen, einen neuen Wert zuweisen. Suchen Sie nach einer Funktion, die einen neuen Balken definiert. Das Konzept seiner Konstruktion sollte Ihnen helfen.

Haben Sie es hier gelesen?

 

Woher weiß ich, wie weit ich vom Markt entfernt sein muss, um einen schwebenden Auftrag zu platzieren?

 
Elektronik:

Woher weiß ich, wie weit ich vom Markt entfernt sein muss, um einen schwebenden Auftrag zu platzieren?

int level=MarketInfo(Symbol(), MODE_STOPLEVEL);

Wenn das StopLevel Null ist, dann ist höchstwahrscheinlich level=MarketInfo(Symbol(), MODE_SPREAD)*2;

Alpari verwendet definitiv die Doppelseite als StopLevel.

Um die Entfernung zu bestimmen, lesen Sie hier.

 

Vielen Dank an artmedia70:

 
artmedia70:

OK, lange Zeit keine Antwort, ich gebe Ihnen einen Tipp: Wenn die Funktion isCloseLastPosByStop () den Wert true zurückgibt, geben Sie einen weiteren Wert zurück, nämlich die Losgröße der letzten gefundenen Position.

Was ist zu tun? Übergeben Sie der Funktion eine Variable per Verweis, in die Sie die Losgröße in der Funktion selbst schreiben werden. Dazu müssen Sie die Funktion isCloseLastPosByStop () leicht abändern

Wenn Sie etwas nicht verstehen, suchen Sie nach einer Funktion, die die Losgröße der letzten geschlossenen Position zurückgibt. Oder Sie können sie selbst herstellen. Und verwenden Sie es, aber das ist kostspieliger als die Übergabe des Loswerts zusammen mit true

Ich habe die Funktion so geändert, dass anstelle der Funktion True eine Variable Lot zurückgegeben wird, in die die Funktion selbst die Größe des Lots geschrieben hat.

Alles wird kompiliert, aber die Aufträge werden nicht geöffnet:

2013.10.23 20:57:46 2011.02.24 16:25 GMT EURUSD,M5: OrderSend Fehler 4051

2013.10.23 20:57:46 2011.09.22 22:20 MITTWOCH EURUSD,M5: Ungültige Losgröße für OrderSend-Funktion

if(isCloseLastPosByStop ()== lot )         //если последний ордер закрылся по стопу
{
P=lot*2;                                      //открыть ордер объемом = объему закрытому по стопу ордеру умноженному на 2                                  
OrderSend(Symbol(),OP_SELL,P,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else                                         //если последний ордер закрылся не по стопу
{

P=0.1;  
OrderSend(Symbol(),OP_SELL,1,Bid,P,Ask+1500*Point,Ask-300*Point,"jfh",123 );   //открыть ордер обычным объемом 0.1
}
   return(0);
  }
//============================================================  
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp,lot, osl;                                             // добавил переменную - количество лотов в оредере
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl)
    lot=OrderLots( ) ;                              //добавил вычисление количества лотов в ордере который закрылся по стопу.
    return(lot);                                    // вместо возвращаемого функцией значения True вставил переменную lot со значением количества лотов
  }
  return(False);
}

Bitte sagen Sie mir, was mein Fehler ist.

Ich danke Ihnen.

 
solnce600:

Ich habe die Funktion dahingehend geändert, dass die Funktion anstelle von True eine Variable Lot zurückgibt, wobei ich die Lotgröße in die Funktion selbst geschrieben habe.

Alles kompiliert, aber die Aufträge werden nicht im Journal geöffnet, sagt:

2013.10.23 20:57:46 2011.02.24 16:25 PM EURUSD,M5: OrderSend Fehler 4051

2013.10.23 20:57:46 2011.09.22 22:20 MITTWOCH EURUSD,M5: Ungültige Losgröße für OrderSend-Funktion

Bitte teilen Sie mir mit, was mein Fehler ist.

Ich danke Ihnen.


Die Funktion, die die letzte geschlossene Position durch Stop bestimmt, hat den Typ bool, während Sie versuchen, den Typ double zurückzugeben. Dementsprechend gibt sie entweder 0 oder 1 zurück.

Ich habe geschrieben, dass wir die Übergabe einer Variablen per Referenz hinzufügen sollten:

//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      t, dg, i, j=-1, k=OrdersHistoryTotal()-1;

   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op           continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss()<0.5*pt)) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
//+----------------------------------------------------------------------------+

Prüfen Sie jetzt zum Beispiel den letzten Buy:

//+----------------------------------------------------------------------------+
double Lot=MarketInfo(Symbol(), MODE_MINLOT);            // задаём минимальное значение переменной
if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot)) {// в переменную Lot будет записано значение лота закрытой позиции
   // Если последний закрытый Buy закрыт по стопу
   Lot= //... эта переменная содержит размер лота закрытой позиции, выполняете нужные вычисления с этой переменной
   }
//+----------------------------------------------------------------------------+

Etwa so...