[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 228
paladin80: Dove è il posto migliore per dichiarare un tipo di variabile (int, double, ecc.) in termini di riduzione del consumo di risorse dell'esecuzione del programma. Per esempio, int i può essere dichiarato globalmente o in int start() ... for (int i=OrdersTotal()-1; i>=0; i--) ... Ho la sensazione che dichiarare su ogni tick sia più costoso che dichiarare una volta a livello globale, subito dopo i parametri extern. O la differenza di intensità di risorse è la stessa?
Tutte le variabili (posizioni di memoria) sono create una volta all'inizio del programma e devono poi essere inizializzate dove si presentano nel testo(dichiarazione di variabile), ma questo non sempre accade, quindi se volete che funzioni correttamente, non dimenticate di inizializzarle esplicitamente quando le dichiarate.
Ho corretto il codice per farlo corrispondere al tuo. Durante i test, quattro ordini hanno chiuso in ordine di impostazione sul primo tick, il quinto ha chiuso sul tick successivo. Probabilmente qui c'è qualcos'altro che non va, come ho testato ripetutamente. Sto incollando il codice del programma e i log del tester. Sinceramente. Shurkin
È chiaro. Sostituire
for(i=0, int k=0; i<OrdersTotal();i++,k++)//
a .
int total=OrdersTotal();
for(i=0, int k=0; i<total;i++,k++)//
Ciao, potresti dirmi come calcolare la somma dei valori dell'indicatore in ogni blocco separato dell'istogramma? Ho scritto un indicatore, ma inizia a funzionare solo quando è impostato. Sulle barre precedenti - niente! Non riesco a ciclare "mentre"! Aiuto, professionisti.
//+-------------------------------------------------------------------------------------+//| Блок поиска своих объектов |//+-------------------------------------------------------------------------------------+bool IsObjectFound()
{
for (int obj=0; obj<=ObjectsTotal()-1; obj++)
{
objName = ObjectName(obj);
isObj = ObjectFind(objName);
objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
objPriceCurr = ObjectGetValueByShift(objName,0);
}
Print("objPriceCurr = ", objPriceCurr);
if (isObj != -1) // Если объект найден, значит выходим из функцииreturn (true);
return (false); // Объект не найден!
}
//+-------------------------------------------------------------------------------------+//| Функция start |//+-------------------------------------------------------------------------------------+int start()
{
int signal = GetSignal();
if (IsObjectFound() == false)
{
Print("В окне отсуствуют объекты, поиск продолжается...");
return (0);
}
Ho mostrato un pezzo di codice dove c'è un malinteso. Tutte le variabili sono dichiarate globali. Nella funzioneIsObjectFound() ottengo i valori del primo e del secondo punto di prezzo dell'oggetto, il nome e il valore del prezzo dell'oggetto sulla barra corrente. Se l'oggetto viene trovato dovrebbe uscire dalla funzione in modalità true, altrimenti infalse .
All'inizio, ho prescritto una condizione che se l'oggetto non viene trovato, allora esco dalla funzione:
L'ho eseguito nel tester, non ho disegnato nessun oggetto, non c'è niente - un grafico nudo. Tuttavia, la funzione non esce e non viene stampata di conseguenza:
Le variabili globali sono ricerche globali. Cosa si può dire dell'algoritmo senza vedere il modello di dati?
Traccerei esattamente i dati. E isObj davvero booleano, e tutto ciò che ...
//+-------------------------------------------------------------------------------------+//| TradingByLine.mq4 |//| hoz |//| |//+-------------------------------------------------------------------------------------+#property copyright "hoz"#property link ""externstring ___H0 = "Параметры отклонений зоны сигнала";
externdouble dernovich = 40,
faustUs = 40;
/*extern double limitOverLine = 3,
limitUnderLine = 20;*/string objName; // Имя объектаint isObj; // Возвращает окно, которому принадлежит// ..наденнный объект, либо -1double objPrice1, // Первая координата цены луча
objPrice2, // Вторая координата цены луча
objPriceCurr; // Цена объекта на заданном бареint pt;
#define SIGNAL_BUY 0// Сигнал на покупку#define SIGNAL_SELL 1// Сигнал на продажу#define SIGNAL_NO -1// Сигнала нет//+-------------------------------------------------------------------------------------+//| Функция иницилизации |//+-------------------------------------------------------------------------------------+int init()
{
if(Digits == 2 || Digits == 4)
pt = Point;
if(Digits == 1 || Digits == 3 || Digits == 5)
pt = Point*10;
if(Digits == 6)
pt = Point*100;
if(Digits == 7)
pt = Point*1000;
return (0);
}
//+-------------------------------------------------------------------------------------+//| Функция деиницилизации |//+-------------------------------------------------------------------------------------+int deinit()
{
//----//----return (0);
}
//+-------------------------------------------------------------------------------------+//| Сигнализатор касания о луч |//+-------------------------------------------------------------------------------------+bool AlertByTouching(int signal)
{
double priceDevBefore,
priceDevAfter;
if (signal == SIGNAL_SELL)
{
priceDevAfter = objPriceCurr + faustUs * pt;
priceDevBefore = objPriceCurr - dernovich * pt;
if (Bid <= priceDevAfter && Bid >= priceDevBefore)
{
Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
return (true);
}
}
if (signal == SIGNAL_BUY)
{
priceDevAfter = objPriceCurr - faustUs * pt;
priceDevBefore = objPriceCurr + dernovich * pt;
Print("priceDevAfter = ", objPriceCurr - faustUs * pt);
Print("priceDevBefore = ", objPriceCurr - faustUs * pt);
Print("Ask >= priceDevAfter && Ask >= priceDevBefore ", Ask ," >= ", priceDevAfter ," && ", Ask ," >= ", priceDevBefore);
if (Ask >= priceDevAfter && Ask >= priceDevBefore)
{
Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
return (true);
}
}
return (false);
}
//+-------------------------------------------------------------------------------------+//| Блок поиска своих объектов |//+-------------------------------------------------------------------------------------+bool GetSignal()
{
if (!IsObjectFound())
return (SIGNAL_NO);
if (objPrice1 > objPrice2)
return (SIGNAL_BUY);
if (objPrice1 < objPrice2)
return (SIGNAL_SELL);
}
//+-------------------------------------------------------------------------------------+//| Блок поиска своих объектов |//+-------------------------------------------------------------------------------------+bool IsObjectFound()
{
for (int obj=0; obj<=ObjectsTotal()-1; obj++)
{
objName = ObjectName(obj);
isObj = ObjectFind(objName);
objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
objPriceCurr = ObjectGetValueByShift(objName,0);
}
Print("objPriceCurr = ", objPriceCurr);
if (isObj != -1) // Если объект найден, значит выходим из функцииreturn (true);
return (false); // Объект не найден
}
//+-------------------------------------------------------------------------------------+//| Функция start |//+-------------------------------------------------------------------------------------+int start()
{
int signal = GetSignal();
if (IsObjectFound() == false)
{
Print("В окне отсуствуют объекты, поиск продолжается...");
return (0);
}
if (signal != SIGNAL_NO)
if (!AlertByTouching(signal))
return (0);
Print("objPrice1 = ", objPrice1, ", objPrice2 = ", objPrice2);
// Print("objPriceCurr = ", objPriceCurr);return (0);
}
isObj è un int. Restituisce la finestra che ha l'oggetto in essa, se ce n'è una. Se non esiste, capisco che restituirà -1. Secondo il documento, la finestra principale inizia a 0 e poi le sottofinestre... Finora, questo è uno schema per un Expert Advisor di trading, puramente di segnale. Ma emette messaggi quando vuole.
Dove è il posto migliore per dichiarare un tipo di variabile (int, double, ecc.) in termini di riduzione del consumo di risorse dell'esecuzione del programma. Per esempio, int i può essere dichiarato globalmente o in int start() ... for (int i=OrdersTotal()-1; i>=0; i--) ... Ho la sensazione che dichiarare su ogni tick sia più costoso che dichiarare una volta a livello globale, subito dopo i parametri extern. O la differenza di intensità di risorse è la stessa?
Tutte le variabili (posizioni di memoria) sono create una volta all'inizio del programma e devono poi essere inizializzate dove si presentano nel testo(dichiarazione di variabile), ma questo non sempre accade, quindi se volete che funzioni correttamente, non dimenticate di inizializzarle esplicitamente quando le dichiarate.
Ho corretto il codice per farlo corrispondere al tuo.
Durante i test, quattro ordini hanno chiuso in ordine di impostazione sul primo tick, il quinto ha chiuso sul tick successivo. Probabilmente qui c'è qualcos'altro che non va, come ho testato ripetutamente.
Sto incollando il codice del programma e i log del tester.
Sinceramente. Shurkin
È chiaro. Sostituire
a .
C'è la seguente situazione:
Ho mostrato un pezzo di codice dove c'è un malinteso. Tutte le variabili sono dichiarate globali. Nella funzioneIsObjectFound() ottengo i valori del primo e del secondo punto di prezzo dell'oggetto, il nome e il valore del prezzo dell'oggetto sulla barra corrente. Se l'oggetto viene trovato dovrebbe uscire dalla funzione in modalità true, altrimenti infalse .
All'inizio, ho prescritto una condizione che se l'oggetto non viene trovato, allora esco dalla funzione:
L'ho eseguito nel tester, non ho disegnato nessun oggetto, non c'è niente - un grafico nudo. Tuttavia, la funzione non esce e non viene stampata di conseguenza:
La funzione di avvio continua. Di cosa si tratta?
Levariabili globali sono ricerche globali. Cosa si può dire dell'algoritmo senza vedere il modello di dati?
Traccerei esattamente i dati. E isObj davvero booleano, e tutto ciò che ...
Le variabili globali sono ricerche globali. Cosa si può dire dell'algoritmo senza vedere il modello di dati?
Traccerei esattamente i dati. E isObj davvero booleano, e tutto ciò che ...
isObj è un int. Restituisce la finestra che ha l'oggetto in essa, se ce n'è una. Se non esiste, capisco che restituirà -1. Secondo il documento, la finestra principale inizia a 0 e poi le sottofinestre... Finora, questo è uno schema per un Expert Advisor di trading, puramente di segnale. Ma emette messaggi quando vuole.