[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 231

 

Ich kopiere sie korrekt in den Indikatorordner7

 
hoz:

Es liegt folgende Situation vor:

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 .


Die Funktion fährt fort, die Startfunktion auszuführen. Was ist das?

Seien Sie niemals gierig mit der Debug-Ausgabe, wenn etwas schief läuft und versuchen Sie, nach weiteren Fehlern zu suchen. Beispiel für ein funktionierendes Skript:

//+------------------------------------------------------------------+
//|                                             Test ObjectFound.mq4 |
//|                                         Copyright © 2013, ir0407 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, ir0407"
#property link      ""

#include <stderror.mqh>
#include <stdlib.mqh>

string objName;
int isObj;
double objPrice1, objPrice2, objPriceCurr; 

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
   if (!IsObjectFound())
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }
  return(0);
}
//+------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound(int ObjType = EMPTY)
{
   int Error;
   //Eсли объектов на графике нет, то и делать нам тут больше нечего
   if(ObjectsTotal(ObjType) == 0)
   {
      Print("Объекты на графике отсутствуют.");
      return(False);
   }
   for (int obj = 0; obj < ObjectsTotal(ObjType); obj++)
   {
      objName = ObjectName(obj);
      //Нужно убедиться что в переменной objName лежит имя объекта,
      //а не какая нибудь чепуха.
      Error = GetLastError();
      if(Error == ERR_NO_ERROR)
      {
        isObj = ObjectFind(objName);
        if(isObj == -1)
        {
          Print("Объект с именем \"", objName, "\" не найден.");
          Error = GetLastError();
          Print("Функция ObjectFind() вернула код ошибки #", Error);
          return(false);
        }
        objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
        objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
        objPriceCurr = ObjectGetValueByShift(objName,0);
        Print("objPrice1 = ", objPrice1);
        Print("objPrice2 = ", objPrice2);
        Print("objPriceCurr = ", objPriceCurr);
      }
      else
      {
        Print("Функция ObjectName() вернула код ошибки #", Error);
        return(false);
      }
   }
   return (True); // Объект найден!
}
 
ir0407:

Seien Sie niemals gierig mit der Debug-Ausgabe, wenn etwas nicht funktioniert und versuchen Sie, nach weiteren Fehlern zu suchen. Beispiel für ein funktionierendes Skript:



Igor, danke für den wertvollen Kommentar. Sie haben Recht! Ich habe noch nie mit Objekten gearbeitet, aber jetzt habe ich den Dreh raus. Ich habe darüber nachgedacht, von welcher Seite ich es angehen soll.
 
GaNDarM:


Sie haben das falsch verstanden. Ich möchte den Wert meines Guthabens nicht auf dem Terminal ändern, obwohl das natürlich schön wäre:)

Ich muss meine Losgröße je nach dem Ergebnis eines früheren Handels (Gewinn oder Verlust) ändern. Und wie man eine Änderung der Einlage (Verlust oder Gewinn) vorschreibt, weiß ich nicht.

Sie können das Handelsergebnis auf 2 Arten kontrollieren (vielleicht gibt es noch andere, ich mag sie):
1) Den vorherigen Wert der Einzahlung speichern und mit dem aktuellen vergleichen (AccountBalance()). Aber diese Methode muss die globalen Variablen des Terminals einbeziehen, damit die Variable ihren Wert beim Neustart des EA oder des Terminals nicht verliert (oder in eine Datei schreiben);

2) Und Sie können das Ergebnis eines früheren Handels in der Historie überprüfen (suchen Sie nach der Funktion in Kims Thread).

 
koSTRIKin:

Ich kopiere sie korrekt in den Indikatorordner7

Der richtige Ordner ist Experten/Indikatoren. Überprüfen Sie vorsichtshalber, ob die Datei nach dem Schreiben im Ordner vorhanden ist.

Wenn sie vorhanden ist, wird sie auf jeden Fall nach dem Kompilieren von Code im Editor angezeigt.

 
      objName = ObjectName(obj);
      //Нужно убедиться что в переменной objName лежит имя объекта,
      //а не какая нибудь чепуха.
      Error = GetLastError();
      if(Error == ERR_NO_ERROR)
Warum sollte es Unsinn sein, wenn die Funktion den Namen des Objekts konkret zurückgibt?
 

GaNDarM

(функцию поищите в ветке у Кима). 

Zweigstelle
 
TarasBY:

Es gibt 2 Möglichkeiten, das Handelsergebnis zu kontrollieren (vielleicht gibt es noch andere, mir genügen diese):
1) Den vorherigen Wert des Depots zu speichern und mit dem aktuellen zu vergleichen (AccountBalance()). Diese Methode muss jedoch globale Variablen des Terminals einbeziehen, damit die Variable ihren Wert nicht verliert, wenn der EA oder das Terminal neu gestartet wird (oder in eine Datei geschrieben wird);

2) Und Sie können das Ergebnis eines früheren Handels in der Historie überprüfen (suchen Sie nach der Funktion in Kims Thread).


Danke, ich werde suchen
 

Warum werden die Variablen in INIT() mit Null belegt? Wo liegt der Fehler oder wie kann man die Kauf- und Verkaufspreise Variablen außerhalb der Funktion start() zuweisen? Ich habe versucht, ihnen RefreshRates(); voranzustellen, aber keine Änderung :(

int init()
  {
   .....
   //---
   UpL  =  Ask;     // Пик вверх изначально равен цене покупки
   DownL  =  Bid;     // Пик вниз изначально равен цене продажи
   
   return(0);
  }
//---end init--------------------------------------------------------
 

Grüße!

Erläutern Sie, wie man programmatisch den Wert der Anzahl der Balken vom Tiefststand der letzten Woche bis zum Beginn der aktuellen Woche ermittelt.