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

 

Bitte helfen Sie mit, dass diese Funktion auch in umgekehrter Richtung funktioniert:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Перенос уровня стопа в безубыток                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//|    Кроме того, функция MovingInWL() предполагает наличие глобальных переменных (внешних параметров скрипта или советника):
//|    int LevelProfit - Уровень профита в пунктах, которого должна достигнуть позиция для того, чтобы её стоп был перенесён на уровень безубытка.
//|    int LevelWLoss - Уровень безубытка в пунктах, на который будет перенесён стоп позиции после того, как её профит достигнет уровня LevelProfit в пунктах.
//+----------------------------------------------------------------------------+
void MovingInWL(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  int    i, k=OrdersTotal();

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      po=MarketInfo(OrderSymbol(), MODE_POINT);
      if (OrderType()==OP_BUY) {
        if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_BID);
          if (pp-OrderOpenPrice()>LevelProfit*po) {
            ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
          }
        }
      }
      if (OrderType()==OP_SELL) {
        if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_ASK);
          if (OrderOpenPrice()-pp>LevelProfit*po) {
            ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
          }
        }
      }
    }
  }
}

Das heißt, wenn der Preis geht zu einem Verlust von einem offenen Auftrag durch die Anzahl der Pips LevelProfit (Sie können es LevelLoss nennen), müssen Sie TakeProfit auf Null oder zu einem Verlust von 1 Pip 2, etc. zu bewegen, je nachdem, was Sie in der LevelWLoss Parameter setzen, so dass, wenn der Preis sogar dreht sich um, gäbe es keinen Gewinn mehr. Oder haben Sie vielleicht ein fertiges Exemplar?

Vielen Dank im Voraus))

 

Guten Tag! Sie wissen, schneiden Sie einfach den Code aus dem EA's init Abschnitt, (Ich war es für das Wochenende zu debuggen - keine Ticks!), verschoben es zu starten. Die äußere fora-Schleife wurde entfernt. Ich habe es zusammengestellt.

Es ist codiert - 'continue' - 'break' oder 'continue' wird nur innerhalb eines Zyklus verwendet C:\Alpari\experts\Outputs.mq4 (69, 20)

Worum geht es dabei? Nun, in loop continuo, in loop, was soll's? Ich spreche nicht viel Englisch. Auch wenn ich einige Wörter verstehe, kann ich mir keinen Reim auf sie machen!

 if (strela1 < strela2)
    {Sleep(600);
        if (SELL > 0) udalenie (OP_SELL);Sleep(600);
        if (BUY == 0)
        {Sleep(600);RefreshRates();
           OrderSend (Symbol( ), OP_SELL, lot, NormalizeDouble (Bid, Digits), 5 , NormalizeDouble( Ask+ (stoplos*Point),Digits),   NormalizeDouble( Ask-( takeprofit*Point),Digits), NULL, magicnumber, 0, CLR_NONE) ;            
           int Error=GetLastError(); 
           Sleep(600);
    if (Error==129)continue;    }
    
    
    }
    else if (strela1 > strela2)
    {Sleep(600);
        if (BUY > 0) udalenie (OP_BUY);Sleep(600);
        if (SELL == 0)
        {Sleep(600); RefreshRates();
             OrderSend (Symbol( ), OP_BUY, lot,NormalizeDouble(Ask, Digits), 5, NormalizeDouble( Bid- (stoplos*Point),Digits),   NormalizeDouble( Ask+( takeprofit*Point),Digits), NULL, magicnumber, 0, CLR_NONE); 
            
           Error=GetLastError(); 
        if (Error==129)continue;  }
 
Dimka-novitsek:

Guten Tag! Sie wissen, schneiden Sie einfach den Code aus dem EA's init Abschnitt, (Ich war es für das Wochenende zu debuggen - keine Ticks!), verschoben es zu starten. Die äußere fora-Schleife wurde entfernt. Zusammengestellt.

C:\Alpari\experts\Outputs.mq4 (69, 20) - 'continue' - 'break' oder 'continue' nur innerhalb eines Zyklus verwendet

Was hat das zu bedeuten? Na ja, in der Schleife, in der Schleife, was soll's? Ich bin nicht sehr gut in Englisch. Wenn ich einige Wörter verstehe, kann ich nicht alle verstehen!

Sie haben keine Schleife, aber Sie haben den Operator continue (der nur in Schleifen verwendet wird).
 
Lians:

Bitte helfen Sie mit, dass diese Funktion auch in umgekehrter Richtung funktioniert:

Das heißt, wenn der Preis geht zu einem Verlust von einem offenen Auftrag durch die Anzahl der Pips LevelProfit (Sie können es LevelLoss nennen), müssen Sie TakeProfit auf Null oder zu einem Verlust von 1 Pip 2, etc. zu bewegen, je nachdem, was Sie in der LevelWLoss Parameter setzen, so dass, wenn der Preis sogar dreht sich um, gäbe es keinen Gewinn mehr. Oder haben Sie vielleicht ein fertiges Exemplar?

Vielen Dank im Voraus))

Die Funktion kann folgendermaßen aussehen:

void fMoving_TPInBU (int fi_LevelLOSS,       // уровень Лосса в пп. (для цены) - ТОЛЬКО > 0
                     int fi_LevelBU,         // уровень БУ в пп. (для тэйкпрофита) - может быть и >= 0 и < 0
                     string fs_Symbol = "",  // Symbol
                     int fi_Type = -1,       // Type
                     int gi_MG = -1)         // MagicNumber
{
    double ld_Point, ld_Price;
    int    li_Type, li_cnt, li_total = OrdersTotal();
//----
    if (li_total == 0) return;
    if (fs_Symbol == "" || fs_Symbol == "0") fs_Symbol = Symbol();
    for (int li_pos = li_total - 1; li_pos >= 0; li_pos--)
    {
        if (!OrderSelect (li_pos, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != fs_Symbol) continue;
        if (gi_MG > -1) if (gi_MG != OrderMagicNumber()) continue;
        li_Type = OrderType();
        if (li_Type > 1) continue;
        if (li_Type > -1) if (li_Type != fi_Type) continue;
        RefreshRates();
        if (li_Type == 0) {li_cnt = 1; ld_Price = MarketInfo (fs_Symbol, MODE_BID);}
        else {li_cnt = -1; ld_Price = MarketInfo (fs_Symbol, MODE_ASK);}
        ld_Point = MarketInfo (OrderSymbol(), MODE_POINT);
        if (li_cnt * (OrderOpenPrice() - ld_Price) >= fi_LevelLOSS * ld_Point)
        {
            double ld_TP = NormalizeDouble (OrderOpenPrice() + li_cnt * fi_LevelBU * ld_Point, MarketInfo (fs_Symbol, MODE_DIGITS));
            //---- Проверка на "излишнюю" модификацию
            if (ld_TP - OrderTakeProfit() != 0.0)
            {OrderModify (OrderTicket(), ld_Price, OrderStopLoss(), ld_TP, 0);}
        }
    }
//----
}

Vergessen Sie nicht, die Einschränkungen MODE_STOPLEVEL und MODE_FREEZELEVEL zu überprüfen, wenn Sie einen STOP modifizieren.

 

Ich danke Ihnen!!! Schauen wir uns das mal an...

Warum nicht? Und wenn (KAUFEN == 0) - ist das nicht eine Schleife? Seltsamerweise habe ich nur die äußere Schleife entfernt, die das gesamte Programm in Klammern einschließt. Sie wurde für die Fehlersuche benötigt, also habe ich sie herausgenommen.

Wenn es nicht vorhanden ist, lassen Sie es passieren, wenn (strela1 < strela2), wird die Logik des Programms nicht gebrochen.

 
Dimka-novitsek:

Ich danke Ihnen!!! Schauen wir uns das mal an...

Warum nicht? Und wenn (KAUFEN == 0) - ist das nicht eine Schleife? Seltsam, ich habe nur die äußere Schleife entfernt, die das gesamte Programm zu Beginn umklammert hat.


Nein. Keine Schleife. Sie haben genau das herausgenommen, was hätte übrig bleiben sollen. Lesen Sie das gesamte Tutorial, insbesondere hier: "Ein Beispiel für die Verwendung eines zusammengesetzten Operators in einem bedingten Operator. Der bedingte Operator if(expression) steht an erster Stelle, gefolgt von dem zusammengesetzten Operator. Der Verbundoperator enthält eine Liste von ausführbaren Operatoren."

 
Lesen.
 
HILFE! Bitte helfen Sie!!! Als Beispiel füge ich dieses Bild bei. Ich bin kein Programmierer diesen Indikator auf irgendeine Weise gelötet, aber dann lief in einen Mangel an Wissen und Fähigkeiten haben eine ganze Woche versucht, die Pfeile auf dem Bildschirm nicht funktionieren. Ich werde das Wesen zu erklären. in ausgewählten Bereichen, in weiß unterstrichen, gibt es eine klare Divergenz (wie ich es verstehe), dass der Unterschied zwischen dem Histogramm und der Preislinie ist. in Abbildung zum Beispiel, markierte ich diese Orte Zahlen 1-2-3-4.In diesen Orten, die Werte des Indikators Linie sinkt modulo, obwohl der Preis weiterhin die Unterseite zu aktualisieren und so haben wir zu Punkt 5 in ihm sehen wir die Basis des Preises aktualisiert niedrig und unten in der Nähe, das Histogramm ist auch wachsen, aber die Linie zeigt einen Rückgang.
Dateien:
tjllfe2.zip  45 kb
 

TarasBY, danke für die Erklärungen und die Funktion!

Ich übernehme die Funktion in meine Sammlung, aber ich verstehe etwas nicht:

Wenn der Parameter fi_LevelBU einen Minuswert hat, verschiebt er die Gewinnmitnahme, wenn er einen Pluswert hat, zeigt er den Gewinn an oder umgekehrt?

Und zweitens: Ist es besser, innerhalb der Funktion selbst oder außerhalb der Funktion nach Beschränkungen zu suchen?

 
Lians:

TarasBY, danke für die Erklärung und die Funktion!

Ich nehme diese Funktion in meine Sammlung auf, aber ich verstehe etwas nicht:

Wenn der Parameter fi_LevelBU negativ ist, bedeutet er eine Verschiebung des TP in Richtung Gewinn, wenn er positiv ist, bedeutet er Gewinn oder umgekehrt?

Richtig (nicht umgekehrt).

Lians:

Und zweitens: Ist es besser, innerhalb der Funktion selbst oder außerhalb dieser Funktion nach Einschränkungen zu suchen?

Jeder entscheidet für sich selbst. Ich habe eine Bibliothek erstellt, die für die Ausführung von Handelsaufträgen zuständig ist und alle Einschränkungen überprüft.

P.S. Es gab einen kleinen Fehler im Funktionscode (zusätzliche Klammern) - ich habe ihn behoben.