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

 
veti-k:

No, questo è troppo. Che cosa è più volatile da almeno 20-50 pips
USDJPY
 

Ragazzi, potete consigliare:

Quando si testa l'advisor sugli indicatori standard inclusi nella consegna di MT4 sulle coppie di valute - nessun problema - tutto funziona secondo l'algoritmo di trading.

Quando si testa sui metalli, come l'argento e l'oro, gli ordini non vengono aperti, nello Strategy Tester Journal si scrive divisione zero.

Ho gli stessi parametri di input, lo storico per questa società di brokeraggio a cinque cifre (forex4yu) è stato caricato per gli strumenti testati.

Qual è la possibile ragione? Non voglio inviare la mia EA a un telepate. Ho scritto personalmente l'Expert Advisor secondo la versione del libro.

 
Roman.:

Ragazzi, potete consigliare:

Nel testare l'advisor sugli indicatori standard inclusi nella consegna di MT4 sulle coppie di valute - nessun problema - tutto funziona secondo l'algoritmo di trading.

Quando si testa sui metalli, come l'argento e l'oro, gli ordini non vengono aperti, nello Strategy Tester Journal si scrive divisione zero.

Ho gli stessi parametri di input, lo storico per questa società di brokeraggio a cinque cifre (forex4yu) è stato caricato per gli strumenti testati.

Qual è la possibile ragione? Non voglio inviare la mia EA a un telepate. Ho scritto personalmente l'Expert Advisor secondo la versione del libro.

Quando si divide per una variabile, bisogna prima controllare che non sia uguale a zero.
 
Roman.:

Ragazzi, potete consigliare:

Nel testare l'advisor sugli indicatori standard inclusi nella consegna di MT4 sulle coppie di valute - nessun problema - tutto funziona secondo l'algoritmo di trading.

Quando si testa sui metalli, come l'argento e l'oro, gli ordini non vengono aperti, nello Strategy Tester Journal si scrive divisione zero.

Ho gli stessi parametri di input, lo storico per questa società di brokeraggio a cinque cifre (forex4yu) è stato caricato per gli strumenti testati.

Qual è la possibile ragione? Non voglio inviare la mia EA a un telepate. Ho scritto personalmente l'Expert Advisor secondo la versione del libro.


Dovreste vedere il codice. In generale, è possibile (in Notepad++) segnare automaticamente tutti i luoghi in cui si verifica un segno di divisione nel codice e vedere se la divisione per zero si verifica effettivamente in qualche caso.
 
drknn:

Mi piacerebbe vedere il codice. E in generale, è possibile (in Notepad++) segnare automaticamente tutti i luoghi in cui il segno di divisione appare nel codice e controllare se in qualche caso la divisione per zero si verifica effettivamente.


Sì, sto già guardando le stampe dove è arrivato lo spacchettamento, lì è tutto a posto...

Nella funzione di normalizzazione del volume per i metalli c'era questo errore (divisione per zero), ora non è presente, c'era un altro 131 - volume errato, anche se impostato ovviamente = 0,01 lotto, guardo in generale...

Per le valute, questa funzione di normalizzazione del volume funziona correttamente.... Forse c'è un comune per loro (per i metalli e le valute)?

//--------------------------------------------------------------------
// Lot_MM.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// double  MaksRisk  - процент риска
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot_MM()                            // Позовательская ф-ия
  {
   int time, ticket;                  // Наибольшее время открытия и номер ордера
   double orderLots;                  // Lots   
   double orderProfit;                // Profit
   double Price;                      // Цена открытия рыночного ордера
   double SL;                         // Значение StopLoss ордера
   double  TP;                        // Значение TakeProfit ордера
   string Symb   =Symbol();                    // Финансовый инструм.
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Размер свободных средств, необходимых для открытия 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
   double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   

//--------------------------------------------------------------- 3 --
   if (Lots>0)                                 // Лоты заданы явно..
{                                              // ..проверим это
      double Money=Lots*One_Lot;               // Стоимость открываемого ордера   
      if(Money<=AccountFreeMargin())             // Средств хватает..     
         {  
          Lots_New=Lots;                           // ..принимаем заданное
            // else                                     // Если не хватает..
            // Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов 
            Print("Функция Lot_MM: Lots_New  = ", Lots_New);    
...
...
...
...
 // ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...            
                    Lots_New = NormalizeLots(Lots_New);  
   return(true);                               // Выход из польз. ф-ии
  }
//--------------------------------------------------------------- 6 --

//+------------------------------------------------------------------+
//| Нормализация лота                                                |
//+------------------------------------------------------------------+

double NormalizeLots(double lot)
{
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   double lots = NormalizeDouble(lot / lotStep, 0) * lotStep;   
   lots = MathMax(lots, MarketInfo(Symbol(), MODE_MINLOT));
   lots = MathMin(lots, MarketInfo(Symbol(), MODE_MAXLOT));   
   return (lots);
}
 

Non riesco a capire: stampa la linea superiore, ma l'ordine non si apre con l'errore 131 - volume sbagliato, ho già impostato 0,1 e 0,01...

 Print ("Функция открытия ордера с рынка - продажа: Teeth = ",  NormalizeDouble(Teeth,Digits), " upfractal = ", upfractal," Цена Bid = ", NormalizeDouble(Bid,Digits), " Lots_New = ", NormalizeDouble(Lots_New,2));                
Ticket=OrderSend(Symbol(),1,0.01,Bid,50,0,0,"Antiunity-start",Magic,0,Red);    

 
Techno:
Quando si divide per una variabile, bisogna prima controllare che non sia uguale a zero.

Grazie, lo terrò presente in futuro. È solo che questa volta ho preso una funzione di normalizzazione del volume già pronta.
 

Nessun uso finora... Scrive lo stesso errore...

 Print ("Функция открытия ордера с рынка - продажа: Teeth = ",  NormalizeDouble(Teeth,Digits), " upfractal = ", upfractal," Цена Bid = ", NormalizeDouble(Bid,Digits), " Lots_New = ", NormalizeDouble(Lots_New,2));                
          Ticket=OrderSend(Symbol(),1,Lots_New,Bid,50,0,0,"Antiunity-start",Magic,0,Red);            
          Print ("Функция открытия ордера с рынка - продажа: старт");      

Ho aperto una posizione per l'oro sul mio conto nel tester con 10.000 e 0,01 e 0,1 lotti - senza risultato.

Forse qualcuno ha avuto un problema simile? Un consiglio, plz...

 

Aggiungete la mia funzione di controllo dei lotti alle vostre subroutine personalizzate. E chiamarlo prima di ogni OrderSend(). L'arrotondamento nel mio dll è fatto dalle leggi della matematica: se il numero arrotondato finisce in parte frazionaria con numero >=5, allora arrotonda per eccesso. Se <=4, allora viene arrotondato per difetto. Per quanto ho capito i linguaggi di programmazione hanno problemi con questo per qualche motivo - ho dovuto fare il mio codice dll. Fondamentalmente, il codice è molto semplice, ma ho cercato molto su Internet ai miei tempi, prima di trovare la soluzione ottimale. Avete bisogno del codice sorgente della dll?

// ============ ProverkaLota() =====================================================================
// функция принимает нормализует лот ордера
//-----------------------------------------------------
double ProverkaLota(double LotOrdera,string SMB){
  double SMB_MinLot=MarketInfo(SMB,MODE_MINLOT);
  double SMB_MaxLot=MarketInfo(SMB,MODE_MAXLOT);
  double SMB_LotStep=MarketInfo(SMB,MODE_LOTSTEP);
  LotOrdera=OkruglenieDoSotykh(LotOrdera);// округляем до сотых

 if(SMB_LotStep==0.1){// округляем до десятых
   LotOrdera/=10;
   LotOrdera=OkruglenieDoSotykh(LotOrdera);
   LotOrdera*=10;// возвращаем дробную часть ордера на место
 }
 if(LotOrdera<SMB_MinLot){
   LotOrdera=SMB_MinLot;
 }
 if(LotOrdera>SMB_MaxLot){
   LotOrdera=SMB_MaxLot;
 }
 return(LotOrdera);
}
// =================================================================================================
File:
basic_dll_1.zip  190 kb
 
drknn:

Aggiungete la mia funzione di controllo dei lotti alle vostre subroutine personalizzate. E chiamarlo prima di ogni OrderSend(). L'arrotondamento nel mio dll è fatto dalle leggi della matematica: se il numero arrotondato finisce in parte frazionaria con numero >=5, allora arrotonda per eccesso. Se <=4, allora viene arrotondato per difetto. Per quanto ho capito i linguaggi di programmazione hanno problemi con questo per qualche motivo - ho dovuto fare il mio codice dll. Fondamentalmente, il codice è molto semplice, ma ho cercato molto su Internet ai miei tempi, prima di trovare la soluzione ottimale. Avete bisogno del codice sorgente della dll?


Sì. Grazie.