[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

 
//записать

void SaveArray(string File, double &a[])
{
    int h = FileOpen(File, FILE_BIN|FILE_WRITE);
    if(h>0)
    {
      int sz = ArraySize(a); 
      FileWriteArray(h,a,0,sz);
      FileClose(h);
    }
}

//прочитать

void OpenArray(string File, double &a[], int sz)
{
    int h = FileOpen(File, FILE_BIN|FILE_READ);
    if(h>0)
    {
      ArrayResize(a,sz);
      FileReadArray(h,a,0,sz);
      FileClose(h);
    }
}
 
Ecco l'annuncio
int Buy[];int Sell[];       string FileBuy="FileBuy.csv",FileSell="FileSell.csv";
 
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.
 
Shurkin:

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.

	          
 

C'è la seguente situazione:

//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
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:

if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }

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:

 Print("В окне отсуствуют объекты, поиск продолжается...");

La funzione di avvio continua. Di cosa si tratta?

 
Non è affatto buono.
 
Cosa c'è che non va?
 

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

 
tara:

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

extern string ___H0 = "Параметры отклонений зоны сигнала";
extern double dernovich = 40,
              faustUs = 40;
/*extern double limitOverLine = 3,
              limitUnderLine = 20;*/

string objName;                                  // Имя объекта
int isObj;                                       // Возвращает окно, которому принадлежит
                                                 // ..наденнный объект, либо -1
double 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.
Motivazione: