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

 

Buon pomeriggio.

La mia strategia tiene conto dello spread, lo spread è definito da una funzione:

double Spread_(){
   double spread = 0.0;
     RefreshRates();
     spread = MathRound((Ask - Bid) / Point);
   return(spread);
}   

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.

 
artmedia70:


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.

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);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}


 

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

 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))

aggiungere tutto al corpo { }

Mi dispiace di non essere Artem.

 
ALXIMIKS:

solnce600:

Dopo

aggiungere tutto al corpo { }

Mi dispiace di non essere Artem.

Grazie .Perdonami per la prima volta.......(non so come aggiungere l'emoticon scherzosa)
 
 t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );

o il lotto di un'altra persona.

 
ALXIMIKS:

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

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);                                // возвращаем истину
 
solnce600:

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
 
ALXIMIKS:

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.