In un Expert Advisor multivaluta, ho bisogno di chiudere un ordine pendente piazzato contro un profitto quando scatta una posizione aperta.
In questo momento, quando chiudo un ordine pendente in profitto, tutti gli ordini pendenti per tutte le valute vengono chiusi.
Come cambiare il codice in modo che solo l'ordine pendente relativo a una coppia di valute si chiuda e il resto rimanga aperto?
Cosa devo cambiare in questo codice?
Mn in questo codice è un numero magico di un ordine pendente BUY_STOP o SELL_STOP.
La logica è che quando una posizione aperta viene chiusa a Take Profit, questo numero magico viene lasciato e si suppone che il comando di cancellazione venga eseguito.
Questo funziona quando si testa ogni coppia. Tuttavia, quando si lavora con altre valute, tutti gli ordini piazzati su tutte le coppie vengono cancellati.
Per favore, aiutate chi è in grado di farlo.
Capisco che nessuno dovrebbe preoccuparsi di questo problema, ma forse qualcuno ha un modello pronto?
Te ne sarei molto grato.
Ho dovuto copiare il codice nell'editor e fare un po' di styling normale (Ctrl+<) per capire cosa hai combinato lì.
Allora: ho commentato nel codice ciò che era incasinato lì:
//+------------------------------------------------------------------+if(OrderMagicNumber()==Mn) // а ордер где-то был выбран ранее?
{
operation=0; // неиспользуемая переменная
{ // лишняя скобкаfor(int i=OrdersTotal()-1; i>=0; i--)
{
OrderSelect(i, SELECT_BY_POS); // нет проверки на результат выделения ордера в списке, и если ордер не выбран, то всё последующее вызовет ошибкиint type = OrderType();
bool result = false;
switch(type)
{ // К СВЕДЕНИЮ - ВСЕ ОПЕРАТОРЫ break ЗАКОММЕНТИРОВАНЫ, А ЗНАЧИТ - ВСЕ СТРОКИ КОДА ОПЕРАТОРА switch ВЫПОЛНЯЮТСЯ ВСЕГДАcase OP_BUYSTOP : // Если выбран отложенный BuyStop, то пытаемся его закрыть как позицию, что вызовет ошибку
result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red); //break;case OP_SELLSTOP : // Если выбран отложенный SellStop, то пытаемся его закрыть как позицию, что вызовет ошибку
result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red); //break;// Независимо от типа выбранного ордера (отложенный или позиция) удаляем его как отложенный, что для позиции вызовет ошибку
result = OrderDelete(OrderTicket()); //break;
}
}
} // лишняя скобка
}
//+------------------------------------------------------------------+
Di conseguenza, il vostro codice fa questo, cioè è equivalente a questo codice:
//+------------------------------------------------------------------+if(OrderMagicNumber()==Mn) // а ордер где-то был выбран ранее?
{
bool result=false;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS)) {}
result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, clrRed);
result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, clrRed);
result = OrderDelete(OrderTicket());
}
}
//+------------------------------------------------------------------+
Per capire cosa hai incasinato lì, ho dovuto copiare il codice nell'editor e fare uno styling adeguato (Ctrl+<).
Quindi: commentate nel codice quello che avete incasinato lì:
Di conseguenza, il vostro codice fa questo, cioè è uguale a questo codice:
Ora chiedetevi: cosa volevate ottenere da questo?
OK.
if(OrderMagicNumber()==Mn) // а ордер где-то был выбран ранее?
qui:
externint mn;//магический номер открытой позицииint Mn=10*mn; //магический номер отложенного ордераint TimFr1=72,TimFr2=24,TimFr3=24;
int start()
{if(Symbol()=="EURUSD")mn=1;if(Symbol()=="GBPUSD")mn=2;if(Symbol()=="USDCHF")mn=3;if(Symbol()=="USDJPY")mn=4;
if(Symbol()=="USDCAD")mn=5;if(Symbol()=="EURGBP")mn=6;if(Symbol()=="AUDUSD")mn=7;if(Symbol()=="NZDUSD")mn=8;
if(Symbol()=="EURJPY")mn=9;if(Symbol()=="EURCHF")mn=10;
Quando viene aperta una posizione (OP_BUY o OP_SELL ), piazziamo simultaneamente ordini pendenti (OP_SELLSTOP e OP_BUYSTOP), rispettivamente.
Quando si chiude una posizione aperta a take profit, l'ordine pendente corrispondente deve essere cancellato. Questo algoritmo viene applicato a tutte le coppie di valute.
Gli altri ordini pendenti piazzati su altre valute dovrebbero rimanere.
Potete dirmi se è possibile impostare il cambio automatico del TimeFrame quando si cambia grafico?
Qualcosa del genere
Create una struttura o un array multidimensionale e fatelo girare sulla dimensione desiderata, se il criterio è soddisfatto, lavorate con una colonna (ogni colonna è responsabile del suo tempo), altrimenti con un'altra colonna, e questo è tutto. Il programma stesso ha accesso a tutti i timeframes contemporaneamente, quindi quello che scrivi è possibile, ma l'implementazione è molto estesa e non puoi vedere questa quantità di lavoro sul forum, perché è molto estesa.
typedefdouble(*CenBr)(string,int,int);CenBr cn_br[4];//глобально//В Ините пытюсь сохранить указатель на функцию iOpen и ничего не выходит
cn_br[0]=iOpen;
Funziona con funzioni semplici, ma c'è qualcosa di strano.
создаём массив double BarOCLH[1000][2][4]
далее сохраняем цену открытия 0 вого бара дневного таймфрейма
BarOCLH[0,0,0]=iOpen ();
далее сохраняем цену открытия 0 вого бара часового таймфрейма
BarOCLH[0,1,0]=iOpen ();и т.д ну а дальше критерируйте с каким столбцом работать
Sì a te. Dovrete lavorare attraverso il gioco con tempistiche su ogni dettaglio in ogni ciclo e in ogni funzione. Questo è il motivo per cui raccomando di usare gli array multidimensionali.
Sì a te. Dovrete lavorare attraverso il gioco con tempistiche su ogni dettaglio in ogni ciclo e in ogni funzione. Questo è il motivo per cui raccomando di usare gli array multidimensionali.
Pomeriggio.
In un Expert Advisor multivaluta, ho bisogno di chiudere un ordine pendente piazzato contro un profitto quando scatta una posizione aperta.
In questo momento, quando chiudo un ordine pendente in profitto, tutti gli ordini pendenti per tutte le valute vengono chiusi.
Come cambiare il codice in modo che solo l'ordine pendente relativo a una coppia di valute si chiuda e il resto rimanga aperto?
Cosa devo cambiare in questo codice?
Mn in questo codice è un numero magico di un ordine pendente BUY_STOP o SELL_STOP.
La logica è che quando una posizione aperta viene chiusa a Take Profit, questo numero magico viene lasciato e si suppone che il comando di cancellazione venga eseguito.
Questo funziona quando si testa ogni coppia. Tuttavia, quando si lavora con altre valute, tutti gli ordini piazzati su tutte le coppie vengono cancellati.
Per favore, aiutate chi è in grado di farlo.
Capisco che nessuno dovrebbe preoccuparsi di questo problema, ma forse qualcuno ha un modello pronto?
Te ne sarei molto grato.
Ho dovuto copiare il codice nell'editor e fare un po' di styling normale (Ctrl+<) per capire cosa hai combinato lì.
Allora: ho commentato nel codice ciò che era incasinato lì:
Di conseguenza, il vostro codice fa questo, cioè è equivalente a questo codice:
Ora chiedetevi: cosa volevate ottenere da questo?
Per capire cosa hai incasinato lì, ho dovuto copiare il codice nell'editor e fare uno styling adeguato (Ctrl+<).
Quindi: commentate nel codice quello che avete incasinato lì:
Di conseguenza, il vostro codice fa questo, cioè è uguale a questo codice:
Ora chiedetevi: cosa volevate ottenere da questo?
OK.
qui:
Quando viene aperta una posizione (OP_BUY o OP_SELL ), piazziamo simultaneamente ordini pendenti (OP_SELLSTOP e OP_BUYSTOP), rispettivamente.
Quando si chiude una posizione aperta a take profit, l'ordine pendente corrispondente deve essere cancellato. Questo algoritmo viene applicato a tutte le coppie di valute.
Gli altri ordini pendenti piazzati su altre valute dovrebbero rimanere.
Buona giornata a tutti voi!
C'è un indicatore MTF_RSI che sta commutando
Potete dirmi se è possibile impostare il cambio automatico del TimeFrame quando si cambia grafico?
Qualcosa come
Buona giornata a tutti voi!
C'è un indicatore MTF_RSI che sta commutando
Potete dirmi se è possibile impostare il cambio automatico del TimeFrame quando si cambia grafico?
Qualcosa del genere
Create una struttura o un array multidimensionale e fatelo girare sulla dimensione desiderata, se il criterio è soddisfatto, lavorate con una colonna (ogni colonna è responsabile del suo tempo), altrimenti con un'altra colonna, e questo è tutto. Il programma stesso ha accesso a tutti i timeframes contemporaneamente, quindi quello che scrivi è possibile, ma l'implementazione è molto estesa e non puoi vedere questa quantità di lavoro sul forum, perché è molto estesa.
Creare una struttura o un array multidimensionale
Grazie.
Perché questo codice non funziona?
Funziona con funzioni semplici, ma c'è qualcosa di strano.
Grazie.
Stai parlando con me?
Sì a te. Dovrete lavorare attraverso il gioco con tempistiche su ogni dettaglio in ogni ciclo e in ogni funzione. Questo è il motivo per cui raccomando di usare gli array multidimensionali.
Sì a te. Dovrete lavorare attraverso il gioco con tempistiche su ogni dettaglio in ogni ciclo e in ogni funzione. Questo è il motivo per cui raccomando di usare gli array multidimensionali.
Questo problema si risolve più facilmente: