[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 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);
    }
}
 
Hier ist die Anzeige
int Buy[];int Sell[];       string FileBuy="FileBuy.csv",FileSell="FileSell.csv";
 
paladin80:
Wo ist die beste Stelle für die Deklaration eines Variablentyps (int, double usw.) im Hinblick auf die Verringerung des Ressourcenverbrauchs bei der Programmausführung? Zum Beispiel kann int i global oder in int start() deklariert werden ... for (int i=OrdersTotal()-1; i>=0; i--) ... Ich habe das Gefühl, dass eine Deklaration bei jedem Tick kostspieliger ist als eine einmalige Deklaration auf globaler Ebene, direkt nach externen Parametern. Oder ist der Unterschied in der Ressourcenintensität derselbe?

Alle Variablen (Speicherplätze) werden einmal beim Programmstart angelegt und müssen dann an der Stelle, an der sie im Text vorkommen, initialisiert werden(Variablendeklaration), was aber nicht immer geschieht. Wenn Sie also wollen, dass alles richtig funktioniert, vergessen Sie nicht, sie bei der Deklaration ausdrücklich zu initialisieren.
 
Schurkin:

Ich habe den Code korrigiert, damit er mit Ihrem übereinstimmt.
Beim Test wurden vier Aufträge in der Reihenfolge ihrer Einstellung beim ersten Tick geschlossen, der fünfte wurde beim nächsten Tick geschlossen. Wahrscheinlich ist hier etwas anderes falsch, wie ich mehrfach getestet habe.
Ich stelle Ihnen den Code des Programms und die Protokolle des Testers zur Verfügung.
Mit freundlichen Grüßen. Shurkin

Das ist klar. Ersetzen Sie

for(i=0, int k=0; i<OrdersTotal();i++,k++)//

zu.

int total=OrdersTotal();
for(i=0, int k=0; i<total;i++,k++)//
 
Hallo, könnten Sie mir sagen, wie ich die Summe der Indikatorwerte in jedem einzelnen Histogrammblock berechnen kann? Ich habe einen Indikator geschrieben, aber er funktioniert nur, wenn er gesetzt ist. Bei vorherigen Balken - nichts! Ich schaffe es nicht, "während" zu radeln!

	          
 

Es liegt folgende Situation vor:

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

Ich habe ein Stück Code gezeigt, bei dem es ein Missverständnis gibt. Alle Variablen werden als global deklariert. Mit der FunktionIsObjectFound() erhalte ich die Werte des ersten und zweiten Preispunktes des Objekts, den Namen und den Preiswert des Objekts auf dem aktuellen Balken. Wenn das Objekt gefunden wird, sollte die Funktion im Modus true beendet werden , ansonsten im Modusfalse .

Zu Beginn habe ich eine Bedingung festgelegt, die besagt, dass ich die Funktion verlasse, wenn das Objekt nicht gefunden wird:

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

Ich lasse es im Tester laufen, ich habe keine Objekte gezeichnet, es gibt nichts - ein nacktes Diagramm. Trotzdem wird die Funktion nicht beendet und entsprechend nicht gedruckt:

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

Die Startfunktion läuft weiter. Was hat es damit auf sich?

 
Das ist überhaupt nicht gut.
 
Was ist los?
 

Globale Variablen sind globale Suchen. Was können Sie über den Algorithmus sagen, ohne das Datenmodell zu kennen?

Ich würde die Daten genau verfolgen. Und isObj wirklich boolesch, und all das ...

 
tara:

Globale Variablen sind globale Suchen. Was können Sie über den Algorithmus sagen, ohne das Datenmodell zu kennen?

Ich würde die Daten genau verfolgen. Und isObj wirklich boolesch, und all das ...


//+-------------------------------------------------------------------------------------+
//|                                                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 ist ein int. Gibt das Fenster zurück, in dem sich das Objekt befindet, falls es eines gibt. Wenn sie nicht vorhanden ist, wird -1 zurückgegeben. Dem Dokument zufolge beginnt das Hauptfenster bei 0 und dann die Unterfenster... Bislang ist dies ein Entwurf für einen Trading Expert Advisor, also ein reines Signal. Aber sie gibt Nachrichten heraus, wann immer sie will.