[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 489

 

Per favore, aiutatemi a rendere questa funzione viceversa:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
          }
        }
      }
    }
  }
}

Cioè, se il prezzo va in perdita da un ordine aperto per il numero di pip LevelProfit (potete chiamarlo LevelLoss), dovete spostare TakeProfit a zero o in perdita di 1 pip 2, ecc, a seconda di quello che mettete nel parametro LevelWLoss, in modo che se il prezzo si gira, non ci sarebbe più profitto. O forse ne hai uno pronto?

Grazie in anticipo))

 

Buon pomeriggio! Sai, basta tagliare il codice dalla sezione init dell'EA, (lo stavo debuggando per il fine settimana - nessun tic!), spostandolo all'avvio. Rimosso il ciclo fora esterno. L'ho compilato io.

È codificato - 'continue' - 'break' o 'continue' usato solo all'interno di qualche ciclo C:\Alpari\expertsOutputs.mq4 (69, 20)

Di cosa si tratta? Beh, in loop continuo, in loop, e allora? Non parlo molto inglese. Se riesco a capire alcune parole, non riesco a dargli un senso!

 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:

Buon pomeriggio! Sai, basta tagliare il codice dalla sezione init dell'EA, (lo stavo debuggando per il fine settimana - nessun tic!), spostandolo all'avvio. Rimosso il ciclo fora esterno. Compilato.

È venuto fuori-- 'continue' - 'break' o 'continue' usato solo all'interno di qualche ciclo C:\Alpari\experts\Outputs.mq4 (69, 20)

Di cosa si tratta? Beh, nel giro, nel giro, e allora? Non sono molto bravo in inglese. Se capisco alcune parole, non posso dare un senso a tutte!

Non hai un ciclo, ma hai l'operatore continue (è usato solo nei cicli).
 
Lians:

Per favore, aiutatemi a rendere questa funzione viceversa:

Cioè, se il prezzo va in perdita da un ordine aperto per il numero di pip LevelProfit (potete chiamarlo LevelLoss), dovete spostare TakeProfit a zero o in perdita di 1 pip 2, ecc, a seconda di quello che mettete nel parametro LevelWLoss, in modo che se il prezzo si gira, non ci sarebbe più profitto. O forse ne hai uno pronto?

Vi ringrazio in anticipo))

La funzione può essere la seguente:

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);}
        }
    }
//----
}

Non dimenticate di controllare i vincoli MODE_STOPLEVEL e MODE_FREEZELEVEL quando modificate uno STOP.

 

Grazie!!! Diamo un'occhiata...

Come no? E se (BUY == 0)- non è un ciclo? Stranamente, ho rimosso solo il ciclo esterno, che circondava l'intero programma tra parentesi. Era necessario per il debug, quindi l'ho tolto.

Se non c'è, lascia passare if (strela1 < strela2), la logica del programma non sarà rotta.

 
Dimka-novitsek:

Grazie!!! Diamo un'occhiata...

Come no? E se (BUY == 0)- non è un ciclo? Strano, ho rimosso solo il ciclo esterno che stava mettendo in parentesi l'intero programma all'inizio.


No, non è un loop. Hai tolto esattamente quello che sarebbe dovuto rimanere. Leggete tutto il tutorial! Soprattutto qui: "Un esempio di utilizzo di un operatore composto in un operatore condizionale. L'operatore condizionale if(expression) viene prima, seguito dall'operatore composto. L'operatore composto contiene una lista di operatori eseguibili".

 
Lettura.
 
AIUTO! Per favore aiutatemi!!! Come esempio, allego questa foto. Io non sono un programmatore questo indicatore per qualche modo saldato, ma poi si imbatté in una mancanza di conoscenze e competenze hanno provato una settimana intera per visualizzare le frecce sullo schermo non ha funzionato. spiegherò l'essenza. in aree selezionate, sottolineato in bianco, c'è una chiara divergenza (come lo capisco) che è la differenza tra l'istogramma e la linea di prezzo. in figura per esempio, ho segnato questi luoghi numeri 1-2-3-4.In questi luoghi, i valori della linea dell'indicatore diminuisce modulo, anche se il prezzo continua ad aggiornare il fondo e così siamo arrivati al punto 5 in esso vediamo la base del prezzo aggiornato basso e inferiore alla chiusura, l'istogramma è anche crescente, ma la linea mostra una diminuzione.
File:
tjllfe2.zip  45 kb
 

TarasBY, grazie per le spiegazioni e la funzione!

Sto prendendo la funzione per la mia collezione, ma non capisco una cosa:

Il parametro fi_LevelBU ha un valore negativo - sposta il profitto, mentre se ha un valore positivo mostra il profitto o viceversa?

E secondo: è meglio controllare i vincoli all'interno della funzione stessa o all'esterno della funzione?

 
Lians:

TarasBY, grazie per le spiegazioni e la funzione!

Sto prendendo la funzione per la mia collezione, ma non capisco una cosa:

Se il parametro fi_LevelBU è negativo, significa spostamento del TP verso il profitto, mentre se è positivo, significa profitto o viceversa?

Corretto (non viceversa).

Lians:

E la seconda: è meglio controllare i vincoli all'interno della funzione stessa o all'esterno della funzione?

Ognuno decide per sé. Ho creato una libreria che è responsabile dell'esecuzione degli ordini di compravendita e controlla tutte le limitazioni.

P.S. C'era un piccolo errore nel codice della funzione (parentesi extra) - l'ho corretto.