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.
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.
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.
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; // Profitdouble 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);
}
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);
}
// =================================================================================================
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?
No, questo è troppo. Che cosa è più volatile da almeno 20-50 pips
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.
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.
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.
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)?
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...
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...
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?
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.