Ma poiché lo spread è costante nel tester di strategia, ho bisogno di un emulatore di spread casuale. Voglio emulare i cambiamenti di spread nel tester nell'intervallo da 2 a 3 punti (4 cifre) nell'80% dei casi e più di 3 punti nel 20% dei casi. Qualche idea su come implementare questo, o link dove tale idea è stata risolta.
L'errore con il mago fa sì che il tuo EA non veda che la sua posizione è chiusa su uno stop quando chiude su uno stop. Perché? La risposta è che si apre una posizione con magic 123 e si invia la variabile Magic alla funzione che controlla la chiusura della posizione allo stop. A cosa pensate che equivalga quando viene inizializzato implicitamente? Zero. La funzione cerca naturalmente le posizioni con il numero magico 0 ed è uguale a 123 nelle vostre posizioni. E non stiamo discutendo, solo... ...ragionamento... Controlla la risposta per chiudere sulla fermata:
Non ho guardato il resto della tua logica EA "morta" - ti stavo aiutando a capire la funzione di controllo stop close...
Artem! Buona giornata, grazie ancora per l'aiuto.
Ho rimosso tutta la logica "morta" non necessaria e ho "rianimato" i rimanenti .... per quanto ne so io.
Ha lasciato solo una funzione, che mi avete aiutato a risolvere.
Ma i miracoli cominciarono ad accadere oltre la mia comprensione
1. Il mio Expert Advisor apre i trade all'inizio di ogni candela (ho una candela a 5 minuti)
e ignorando tutte le condizioni.
Cioè il controllo entra nella prima linea
double Price=iOpen(Symbol (),0,0);
E poi salta attraverso 11 linee e arriva alle seguenti linee
2. Se rimuoviamo la linea che calcola il lotto minimo Lot=MarketInfo(Symbol(), MODE_MINLOT);
L'Expert Advisor funziona bene, ma la funzione isCloseLastPosByStop non funziona.
Mi sono sforzato il cervello per molto tempo..... ma invano. Vi sarei grato se poteste dirmi dove si nasconde l'errore.
double Lot = 0.1; //я проинициализировал переменнуюint Magic=123;
int start()
{
double Price=iOpen(Symbol (),0,0); //запоминаем время открытия очередной свечиint ot=OrdersTotal(); //запоминаем количество всех открытых ордеровif ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point)) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам Lot=MarketInfo(Symbol(), MODE_MINLOT); //вычислить минимальный лот инструментаif (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
{ //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
t=Lot*2; // удваиваем начальный лотOrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else//в противном случае(если функция на вернула ??????
{
Lot=0.1; // лот отстается 0.1 OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
return(0);
}
//+----------------------------------------------------------------------------+bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
double pt;
int dg, i, j=-1, k=OrdersHistoryTotal()-1;
datetime t=0; // во избежание возможных ошибок после возможных будущих улучшенийfor (i=k; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderMagicNumber()!=mn) continue; // если магик не тот, переходим к следующемуif (OrderSymbol()!=sy) continue; // если символ не тот, переходим к следующемуif (OrderType()!=op) continue; // если тип не тот, переходим к следующемуif (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(OrderSymbol(), MODE_DIGITS); // количество знаков в цене символа ордера
pt=MarketInfo(OrderSymbol(), MODE_POINT); // размер пункта инструмента в валюте котировки ордераif (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
}
}
return(False); // возвращаем ложь (позиции нету, либо не по стопу)
}
Tutta la mia "logica morta" rimossa inutilmente e "ravvivato" il resto.... per quanto ne so io.
Ho praticamente lasciato solo la funzione, che mi avete aiutato a correggere.
Ma i miracoli, che vanno oltre la mia comprensione, hanno cominciato ad accadere.
Dopo
if ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
Ho fatto come hai detto tu..... ahimè il consigliere funziona .... la funzione isCloseLastPosByStop non funziona
double Lot=0.1;
int Magic=123;
int start()
{
double Price=iOpen(Symbol (),0,0); //запоминаем время открытия очередной свечиint ot=OrdersTotal(); //запоминаем количество всех открытых ордеровif ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если ПРИ ЭТОМ цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
{ Lot=MarketInfo(Symbol(), MODE_MINLOT); //вычислить минимальный лот инструментаif (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
{ //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
Lot=Lot*2; // удваиваем начальный лотOrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else//в противном случае(если функция на вернула??????
{
Lot=0.1; // лот отстается 0.1 OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
} return(0);
}
//+----------------------------------------------------------------------------+bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
double pt;
int dg, i, j=-1, k=OrdersHistoryTotal()-1;
datetime t=0; // во избежание возможных ошибок после возможных будущих улучшенийfor (i=k; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderMagicNumber()!=mn) continue; // если магик не тот, переходим к следующемуif (OrderSymbol()!=sy) continue; // если символ не тот, переходим к следующемуif (OrderType()!=op) continue; // если тип не тот, переходим к следующемуif (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(OrderSymbol(), MODE_DIGITS); // количество знаков в цене символа ордера
pt=MarketInfo(OrderSymbol(), MODE_POINT); // размер пункта инструмента в валюте котировки ордераif (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
}
}
return(False); // возвращаем ложь (позиции нету, либо не по стопу)
}
Questo è un pezzo di codice della funzione bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
Ma cosa succede se c'è uno slittamento di 3 pip? Non è molto ben pensato ))
if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
Ho cercato per una settimana di capire perché questa funzione non funziona per me.
Cioè ho bisogno che l'ordine successivo si apra con un volume doppio dell'ordine chiuso allo stop, e che l'ordine successivo si apra con un volume regolare dopo il non-stop.
Correggere la logica del lavoro, altrimenti ci vorrà molto tempo per pensare
Questo è un pezzo di codice della funzione bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
Ma cosa succede se c'è uno slittamento di 3 pip? Non è molto ben pensato ))
Capisci - non mi preoccupo ancora....
È da una settimana che non capisco perché questa funzione non funziona come vorrei.
Cioè devo aprire l'ordine successivo allo stop con un volume doppio dell'ordine che ha chiuso allo stop, e dopo il non-stop, l'ordine successivo viene aperto con un volume regolare.
Buon pomeriggio.
La mia strategia tiene conto dello spread, lo spread è definito da una funzione:
Ma poiché lo spread è costante nel tester di strategia, ho bisogno di un emulatore di spread casuale. Voglio emulare i cambiamenti di spread nel tester nell'intervallo da 2 a 3 punti (4 cifre) nell'80% dei casi e più di 3 punti nel 20% dei casi. Qualche idea su come implementare questo, o link dove tale idea è stata risolta.
L'errore con il mago fa sì che il tuo EA non veda che la sua posizione è chiusa su uno stop quando chiude su uno stop. Perché? La risposta è che si apre una posizione con magic 123 e si invia la variabile Magic alla funzione che controlla la chiusura della posizione allo stop. A cosa pensate che equivalga quando viene inizializzato implicitamente? Zero. La funzione cerca naturalmente le posizioni con il numero magico 0 ed è uguale a 123 nelle vostre posizioni. E non stiamo discutendo, solo... ...ragionamento... Controlla la risposta per chiudere sulla fermata:
Non ho guardato il resto della tua logica EA "morta" - ti stavo aiutando a capire la funzione di controllo stop close...
Artem! Buona giornata, grazie ancora per l'aiuto.
Ho rimosso tutta la logica "morta" non necessaria e ho "rianimato" i rimanenti .... per quanto ne so io.
Ha lasciato solo una funzione, che mi avete aiutato a risolvere.
Ma i miracoli cominciarono ad accadere oltre la mia comprensione
1. Il mio Expert Advisor apre i trade all'inizio di ogni candela (ho una candela a 5 minuti)
e ignorando tutte le condizioni.
Cioè il controllo entra nella prima linea
double Price=iOpen(Symbol (),0,0);
E poi salta attraverso 11 linee e arriva alle seguenti linee
Lot=0.1;
OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point, "jfh",123 );
2. Se rimuoviamo la linea che calcola il lotto minimo Lot=MarketInfo(Symbol(), MODE_MINLOT);
L'Expert Advisor funziona bene, ma la funzione isCloseLastPosByStop non funziona.
Mi sono sforzato il cervello per molto tempo..... ma invano. Vi sarei grato se poteste dirmi dove si nasconde l'errore.
solnce600:
Артем ! Добрый день! Еще раз спасибо за помощь.
Tutta la mia "logica morta" rimossa inutilmente e "ravvivato" il resto.... per quanto ne so io.
Ho praticamente lasciato solo la funzione, che mi avete aiutato a correggere.
Ma i miracoli, che vanno oltre la mia comprensione, hanno cominciato ad accadere.
Dopo
aggiungere tutto al corpo { }
Mi dispiace di non essere Artem.
solnce600:
Dopo
aggiungere tutto al corpo { }
Mi dispiace di non essere Artem.
o il lotto di un'altra persona.
solnce600:
Dopo
aggiungere tutto al corpo { }
Mi dispiace di non essere Artem.
Ho fatto come hai detto tu..... ahimè il consigliere funziona .... la funzione isCloseLastPosByStop non funziona
Questo è un pezzo di codice della funzione bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
Ma cosa succede se c'è uno slittamento di 3 pip? Non è molto ben pensato ))
Tu capisci - non me ne preoccupo ancora....
Ho cercato per una settimana di capire perché questa funzione non funziona per me.
Cioè ho bisogno che l'ordine successivo si apra con un volume doppio dell'ordine chiuso allo stop, e che l'ordine successivo si apra con un volume regolare dopo il non-stop.
Correggere la logica del lavoro, altrimenti ci vorrà molto tempo per pensare
Questo è un pezzo di codice della funzione bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
Ma cosa succede se c'è uno slittamento di 3 pip? Non è molto ben pensato ))
Capisci - non mi preoccupo ancora....
È da una settimana che non capisco perché questa funzione non funziona come vorrei.
Cioè devo aprire l'ordine successivo allo stop con un volume doppio dell'ordine che ha chiuso allo stop, e dopo il non-stop, l'ordine successivo viene aperto con un volume regolare.E perché toccare la cronologia degli ordini? Guarda il saldo - dove è andato in quella direzione e cambia il lotto.
Se si tratta solo di un robot che farà trading sul vostro conto.