[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 192
Questo è quello che ottengo quando l'EA funziona nel tester:
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: open #1 sell limit 2.00 EURUSD at 1.27972 ok 2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: Alert: OrderExpiration = 2012.01.11:12:00 2013.03.01 12:45:58 2012.01.12 16:29 Tester: ordine #1, vendere 2.00 EURUSD è aperto a 1.27972
Cioè, data e ora di scadenza sono impostati correttamente, come voglio, ma non chiudo al momento della scadenza - una posizione è aperta dopo 24 ore.
Ho cercato in alcuni forum e il problema si verifica. Le solite risposte sono "funziona per me" o "rintracciate voi stessi gli ordini in sospeso". Non voglio seguirli da solo e non funziona per me.
borilunad: Sergey, lascio aperta la questione della funzione per ora, perché domani inserirò altre funzioni nel tuo test EA per condurre un esperimento pulito. L'ho guardato in modalità visiva e quasi tutte le doppie chiusure sono le ultime, quelle precedenti sono chiuse da SL e TP, cioè non c'è niente da scegliere. Ho rimosso Stops and Takes per avere qualcosa da scegliere. Domani mostrerò il vostro Expert Advisor con tutte le funzioni aggiuntive e i commenti! Potrete vedere voi stessi come funziona la funzione. Voglio davvero che si dimostri che avevo torto! Se ho ragione, cercherò di fare del mio meglio! A domani!
Sergey, Dubakin Ho fatto un controllo visivo e mi sono assicurato che questa funzione selezioni i massimi, che è quello di cui avevo bisogno! Sono contento di non avere più dubbi, e mi scuso con te! Ma nel nostro mestiere "è meglio misurare sette volte..." Sto mostrando al tuo tester EA per testare la funzione, con l'aggiunta di caratteristiche e commenti per un controllo visivo più chiaro! Grazie!
externint EA_Magic=135; // внешняя переменнаяint TimeNow, TimePrev, PrevType; // глобальные переменныеint start()
{
double Price,SL,TP;
int Ticket;
TimeNow=iTime(NULL,240,0);
if(TimePrev==TimeNow) return(0);
if(PrevType!=1) {
Price=NormalizeDouble(Ask,Digits);
// SL=NormalizeDouble(Price-300*Point,Digits); // TP=NormalizeDouble(Price+300*Point,Digits);
Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,0,0,"",EA_Magic);
if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }
elseif(PrevType!=-1) {
Price=NormalizeDouble(Bid,Digits);
// SL=NormalizeDouble(Price+300*Point,Digits); // TP=NormalizeDouble(Price-300*Point,Digits);
Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,0,0,"",EA_Magic);
if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }
Comment("BuyPos: ",NumberOfBuyPositions(),"; SellPos: ",NumberOfSellPositions(),
"; LotPos: ",GetAmountLotFromOpenPos(),
"\nMaxLoss: ",DoubleToStr(GetMinProfit(),2),"; MaxProf: ",DoubleToStr(GetMaxProfit(),2),
"\nLossDiff: ",DoubleToStr(GetMinProfit()+GetMaxProfit(),2));
if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);
return(0);
}
bool LockOFF(int EA_Magic) {
double Result, PrevLoss, PrevProfit;
int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
bool Ans;
MaxProfitTicket=-1; MaxLossTicket=-1;
orders_total=OrdersTotal();
for(pos=orders_total-1; pos>=0; pos--) {
if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордерif(OrderType()>1) continue;
Result=OrderProfit()+OrderSwap()+OrderCommission();
if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); // end of for
} }
if(MaxLossTicket==-1) return(false); // нет убыточной позицииif(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY;
orders_total=OrdersTotal();
for(pos=orders_total-1; pos>=0; pos--) {
if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордерif(order_type!=OrderType()) continue;
Result=OrderProfit()+OrderSwap()+OrderCommission();
if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
PrevProfit=Result; MaxProfitTicket=OrderTicket(); // end of for
} }
if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции
Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
if(!Ans) {
Print("Ошибка при встречном закрытие!"); return(false);
}
return(true);
}
//+----------------------------------------------------------------------------+int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal(), kp=0;
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY) {
if (op<0 || OrderType()==op) {
kp++;
} } } }
return(kp);
}
//+----------------------------------------------------------------------------+int NumberOfSellPositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal(), kp=0;
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
kp++;
} } } }
return(kp);
}
//+----------------------------------------------------------------------------+double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int i, k=OrdersTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
l+=OrderLots();
} } } }
return(l);
}
//+----------------------------------------------------------------------------+double GetMinProfit(string sy="", int op=-1, int mn=-1) {
double p;
int i, k=OrdersTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (p>OrderProfit()+OrderCommission()+OrderSwap())
p=OrderProfit()+OrderCommission()+OrderSwap();
} } } }
return(p);
}
//+----------------------------------------------------------------------------+double GetMaxProfit(string sy="", int op=-1, int mn=-1) {
double p;
int i, k=OrdersTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (p<OrderProfit()+OrderCommission()+OrderSwap())
p=OrderProfit()+OrderCommission()+OrderSwap();
} } } }
return(p);
}
//+----------------------------------------------------------------------------+
Sergey, Dubakin Ho fatto un controllo visivo e mi sono assicurato che questa funzione selezioni i massimi, che è quello di cui avevo bisogno! Sono contento di non avere più dubbi, e mi scuso con te! Ma nel nostro mestiere "è meglio misurare sette volte..." Sto mostrando al tuo tester EA per testare la funzione, con l'aggiunta di caratteristiche e commenti per un controllo visivo più chiaro! Grazie!
Come mai... Sulla base di Igor Kim ha fatto qualcosa... Solo una delle tue caratteristiche... gli altri sono gli stessi...
//+----------------------------------------------------------------------------+int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) { // для чего присвоены значения по-умолчанию, если они нигде не используются? Кроме op (и то неверно)
int i, k=OrdersTotal(), kp=0;
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY) { // тут жесткая проверка на тип Buy
if (op<0 || OrderType()==op) { // тут лишняя проверка на значение op, используемое по умолчанию и ещё одна лишняя проверка на ==op
kp++;
} } } }
return(kp);
}
//+----------------------------------------------------------------------------+
qualcosa del genere, credo:
//+----------------------------------------------------------------------------+int NumberOfPositions(string sy, int op, int mn) {
int i, k=OrdersTotal()-1, kp=0;
for (i=k; i>=0; i--) {
if (OrderSelect(i,SELECT_BY_POS)) { // если ордер выбран
if (OrderMagicNumber()!=mn) continue; // если не наш магик - смотрим следующий ордер
if (OrderSymbol()!=sy) continue; // если не наш символ - смотрим следующий ордер
if (OrderType()!=op) continue; // если не соответствует тип - смотрим следующий
kp++; // тут искомый ордер - увеличим счётчик
}
}
return(kp);
}
//+----------------------------------------------------------------------------+
E chiamarla fuori:
per il conteggio di Buy e Sell per il simbolo corrente, con Magic
//+----------------------------------------------------------------------------+int BuyPos= NumberOfPositions(Symbol(), OP_BUY, Magic);
int SellPos=NumberOfPositions(Symbol(), OP_SELL, Magic);
//+----------------------------------------------------------------------------+
La variabile i ha un valore di 0 solo all'inizio del ciclo. Inoltre aggiungerà 1 valore ad ogni iterazione.
Poi c'è una condizione che farà continuare il ciclo:
min>OrderLots()
Ma min è dichiarato come zero e il suo valore non cambia da nessun'altra parte nel codice. Il che significa che questo valore non sarà mai vero! Dov'è la logica?
Ho navigato nel thread. La tua logica è strana. Mi interessa l'ultima linea di codice:
La variabile i ha un valore di 0 solo all'inizio del ciclo. Inoltre aggiungerà valore ad ogni iterazione di 1.
Poi c'è una condizione perché il ciclo continui:
Ma min è dichiarato come zero, e il suo valore non cambia mai da nessun'altra parte nel codice. Il che significa che questo valore non sarà mai vero! Dov'è la logica?
int i, ot = OrdersTotal();
double min=0.0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(min==0.0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
Se lo facciamo in questo modo, tutte le cose strane dovrebbero scomparire.
Ho guardato attraverso il ramo. La tua logica è strana. Sono interessato all'ultima linea di codice:
La variabile i ha valore 0 solo all'inizio del ciclo. Inoltre aggiungerà valore ad ogni iterazione di 1.
Poi c'è una condizione perché il ciclo continui:
Ma min è dichiarato come zero, e il suo valore non cambia mai da nessun'altra parte nel codice. Il che significa che questo valore non sarà mai vero! Dov'è la logica?
Igor Kim ha un consulente che fa quanto segue ad un intervallo stabilito
Grazie!
Salve.
Problema con gli ordini in sospeso, in particolare la data di scadenza.
Questo è il modo in cui viene aperto un nuovo ordine, cioè se non è stato attivato in un'ora, il server dovrebbe chiuderlo.
Poi controllo qual è la data di scadenza:
Questo è quello che ottengo quando l'EA funziona nel tester:
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: open #1 sell limit 2.00 EURUSD at 1.27972 ok
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: Alert: OrderExpiration = 2012.01.11:12:00
2013.03.01 12:45:58 2012.01.12 16:29 Tester: ordine #1, vendere 2.00 EURUSD è aperto a 1.27972
Cioè, data e ora di scadenza sono impostati correttamente, come voglio, ma non chiudo al momento della scadenza - una posizione è aperta dopo 24 ore.
Ho cercato in alcuni forum e il problema si verifica. Le solite risposte sono "funziona per me" o "rintracciate voi stessi gli ordini in sospeso". Non voglio seguirli da solo e non funziona per me.
Igor Kim ha un consulente che fa quanto segue ad un intervallo stabilito
Funziona alla grande.
Grazie per il suggerimento!
Funziona alla grande.
Grazie per il suggerimento!
Non sono io, è Google.
Penso che tu possa estrarre la funzione di salvataggio dello schermo da lì e impostare i tuoi parametri per chiamarla - sono stato troppo pigro...
Sergey, lascio aperta la questione della funzione per ora, perché domani inserirò altre funzioni nel tuo test EA per condurre un esperimento pulito. L'ho guardato in modalità visiva e quasi tutte le doppie chiusure sono le ultime, quelle precedenti sono chiuse da SL e TP, cioè non c'è niente da scegliere. Ho rimosso Stops and Takes per avere qualcosa da scegliere. Domani mostrerò il vostro Expert Advisor con tutte le funzioni aggiuntive e i commenti! Potrete vedere voi stessi come funziona la funzione. Voglio davvero che si dimostri che avevo torto! Se ho ragione, cercherò di fare del mio meglio! A domani!
Sergey, Dubakin Ho fatto un controllo visivo e mi sono assicurato che questa funzione selezioni i massimi, che è quello di cui avevo bisogno! Sono contento di non avere più dubbi, e mi scuso con te! Ma nel nostro mestiere "è meglio misurare sette volte..." Sto mostrando al tuo tester EA per testare la funzione, con l'aggiunta di caratteristiche e commenti per un controllo visivo più chiaro! Grazie!
Sergey, Dubakin Ho fatto un controllo visivo e mi sono assicurato che questa funzione selezioni i massimi, che è quello di cui avevo bisogno! Sono contento di non avere più dubbi, e mi scuso con te! Ma nel nostro mestiere "è meglio misurare sette volte..." Sto mostrando al tuo tester EA per testare la funzione, con l'aggiunta di caratteristiche e commenti per un controllo visivo più chiaro! Grazie!
Come mai... Sulla base di Igor Kim ha fatto qualcosa... Solo una delle tue caratteristiche... gli altri sono gli stessi...
qualcosa del genere, credo:
E chiamarla fuori:
per il conteggio di Buy e Sell per il simbolo corrente, con Magic
Puoi dirmi come scegliere il lotto più piccolo tra tutti i trade aperti?
double min=0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continua;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continua;
if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
La variabile i ha un valore di 0 solo all'inizio del ciclo. Inoltre aggiungerà 1 valore ad ogni iterazione.Ho navigato nel thread. La tua logica è strana. Mi interessa l'ultima linea di codice:
Poi c'è una condizione che farà continuare il ciclo:
Ma min è dichiarato come zero e il suo valore non cambia da nessun'altra parte nel codice. Il che significa che questo valore non sarà mai vero! Dov'è la logica?
La variabile i ha un valore di 0 solo all'inizio del ciclo. Inoltre aggiungerà valore ad ogni iterazione di 1.Ho navigato nel thread. La tua logica è strana. Mi interessa l'ultima linea di codice:
Poi c'è una condizione perché il ciclo continui:
Ma min è dichiarato come zero, e il suo valore non cambia mai da nessun'altra parte nel codice. Il che significa che questo valore non sarà mai vero! Dov'è la logica?
La variabile i ha valore 0 solo all'inizio del ciclo. Inoltre aggiungerà valore ad ogni iterazione di 1.Ho guardato attraverso il ramo. La tua logica è strana. Sono interessato all'ultima linea di codice:
Poi c'è una condizione perché il ciclo continui:
Ma min è dichiarato come zero, e il suo valore non cambia mai da nessun'altra parte nel codice. Il che significa che questo valore non sarà mai vero! Dov'è la logica?Si prega di notare
Se min>OrderLots(), allora min = OrderLots();
Si prega di notare
Se min>OrderLots() allora, min = OrderLots();