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

 
Per favore, aiutatemi a correggere gli errori in questa funzione. Mi ha già spremuto tutto il succo. L'essenza della funzione, quando raggiunge un certo profitto, la funzione dovrebbe chiudere la metà dell'ordine.
void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
{
if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderProfit()>= NormalizeDouble (TP*Point,Digits))
{
if (OrderType() == OP_BUY)
double Lots = OrderLots();
double HalfLot = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);

if (OrderType() == OP_SELL)
double Lots1 = OrderLots();
double HalfLot1 = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
}
}
}
}

Oh, e come faccio a far funzionare questa funzione solo una volta per ordine aperto?
 
Trader7777:
Per favore, aiutatemi a correggere gli errori in questa funzione. Mi ha già spremuto tutto il succo. L'essenza della funzione, quando raggiunge un certo profitto, la funzione dovrebbe chiudere la metà dell'ordine.
Oh, e come faccio a far funzionare questa funzione solo una volta per ordine aperto?
Potete trovare il principio della chiusura parziale qui.
 
Trader7777:
Per favore, aiutatemi a correggere gli errori in questa funzione. Mi ha già spremuto tutto il succo. L'essenza della funzione, quando raggiunge un certo profitto, la funzione dovrebbe chiudere la metà dell'ordine.

void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
{
if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic){//Нефига тут профиту делать, это так, для убыстрения....

if(OrderProfit()>= NormalizeDouble (TP*Point,Digits)) //А тут вообще непонятки что с чем сравниваете....
{
if (OrderType() == OP_BUY)
double Lots = OrderLots();
double HalfLot = NormalizeDouble (Lots*0.5,2);// Тут озаботится чтобы лот не стал меньше минимального
OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);

if (OrderType() == OP_SELL)
double Lots1 = OrderLots();
double HalfLot1 = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
}
}
}

}


}

Oh, e come faccio a far funzionare questa funzione solo una volta per ordine aperto?
 
TarasBY:
Potete vedere il principio degli ordini di chiusura parziale qui.

Grazie. Ma voglio ancora capire i miei errori prima di tutto. Sto ancora imparando. Inoltre, credo di essere molto vicino alla verità.

 

un'altra volta... La funzione non funziona. Voglio capire gli errori. + come farlo scattare solo 1 volta per 1 ordine aperto? Grazie mille in anticipo)

extern int TP         = 200; // это количество пунктов после которых должно произойти частичное закрытие
extern int Magic      = 77;


void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
  {
    if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
      {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderProfit()>= NormalizeDouble (TP*Point,Digits))
          {
            if (OrderType() == OP_BUY) 
            double Lots = OrderLots(); 
            double HalfLot  = NormalizeDouble (Lots*0.5,2); // изначально ( при открытии ордера) лот рассчитывается так, что он не может быть меньше чем 0,02
            OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);
          
            if (OrderType() == OP_SELL)
            double Lots1 = OrderLots(); 
            double HalfLot1  = NormalizeDouble (Lots*0.5,2);
            OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
          }
        }
      }
    }
 
Trader7777:

un'altra volta... La funzione non funziona. Voglio capire gli errori. + come farlo scattare solo 1 volta per 1 ordine aperto?


La condizione una volta per un ordine non è molto chiara. Bene, probabilmente dovremo usare variabili globali qui. Forse c'è più di un ordine, e solo una volta per ciascuno?
 
Trader7777:

un'altra volta... La funzione non funziona. Voglio capire gli errori. + come farlo scattare solo 1 volta per 1 ordine aperto?

Filtrare per dimensione del lotto
 

Ho la seguente situazione. Ci sono diversi moduli nell'EA, ogni modulo prende diverse funzioni personalizzate. Per non affogare nel codice, ho deciso di mettere ogni modulo in script. Ecco la variante di chiamare lo script dall'Expert Advisor. Il prossimo problema sorge però: quando chiamo lo script, ho bisogno di passargli alcuni parametri. Possiamo usare variabili globali. Quali altre varianti si possono suggerire?

Ve lo dico subito: la variante "più semplice" tramite iCustom() non mi soddisfa, per due motivi. In primo luogo, la chiamata del modulo dovrebbe essere occasionale in memoria, non costante. In secondo luogo, non uso gli array di indicatori.

 
Sepulca:

La condizione una volta per un ordine non è molto chiara. Beh, probabilmente dovrete usare le variabili globali qui. Possono esserci più ordini e solo una volta per ciascuno?

Ci può essere solo un ordine nel mercato. Al momento, questa funzione non funziona affatto... per qualche motivo. Ma se funzionerà correttamente, capisco che sarà attivato tutto il tempo, fino a quando il profitto è superiore alla quantità di pip impostata. Naturalmente, ci serve per chiudere metà di una posizione una volta, e basta. Ma vorrei che funzionasse almeno una volta).
 
gyfto:

Ho la seguente situazione. Ci sono diversi moduli nell'EA, ogni modulo prende diverse funzioni personalizzate. Per non affogare nel codice, ho deciso di mettere ogni modulo in script. Ecco la variante di chiamare lo script dall'Expert Advisor. Il prossimo problema sorge però: quando chiamo lo script, ho bisogno di passargli alcuni parametri. Possiamo usare variabili globali. Quali altre varianti si possono suggerire?

Ve lo dico subito: la variante "più semplice" tramite iCustom() non mi soddisfa, per due motivi. In primo luogo, la chiamata del modulo dovrebbe essere occasionale in memoria, non costante. In secondo luogo, non uso gli array di indicatori.


Una biblioteca è un'opzione.
Motivazione: