[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 1126

 
drknn:


Der Code ist falsch. Erstens, wenn die Funktion start() vom Typ int ist, sollte sie einen Integer-Wert zurückgeben. Sie haben eine Rücksendung nur unter der Bedingung zurückgegeben. Und wenn die Bedingung nicht erfüllt ist, was sollte die Funktion start() an das Terminal zurückgeben?

Darüber hinaus sind Sie zu kompliziert zu überprüfen - besser, wie folgt zu tun: Wir erstellen einen Zähler der Aufträge, offen und geschlossen heute. Wenn die Anzahl der heute abgeschlossenen Aufträge größer als Null ist, dann handeln Sie nicht. Ansonsten dürfen wir handeln.

int in void geändert... hat nicht geholfen

Um ehrlich zu sein, verstehe ich nicht wirklich, wie man einen Zähler für Aufträge erstellen kann und trotzdem in der Lage ist, die einmalige tägliche Handelsoption zu aktivieren/deaktivieren....

.... denke-denke-denke, ich werde es so versuchen

if(CalculateCurrentOrders(Symbol())==0 && Orders==0)

{

CheckForOpen();

if(WaitForNewDay) {Orders++;}

Rückkehr;

}

Zähler zurücksetzen:

if(WaitForNewDay)CheckForNewDay();

void CheckForNewDay()

{

tm=iTime(Symbol(),PERIOD_D1,0);

if (bt!=tm) {bt=tm; Orders=0;}

}

Wie auch immer, ich bin zu dem zurückgekehrt, wovor ich weggelaufen bin ))))

 
dzhini:

int in void geändert... hat nicht geholfen

Ehrlich gesagt, verstehe ich nicht, wie man einen Auftragszähler erstellt und trotzdem die Option "Einmaliger Tageshandel" aktivieren/deaktivieren kann....

-------------

Wie auch immer, zurück zu dem, wovor ich weglaufen wollte ))))

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                          Copyright © 2010, Drknn |
//|                                                    drknn@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Drknn"
#property link      "drknn@mail.ru"

// ---------- Пользовательские переменные ----------------------------
extern int      MAGIC=0;//У ордеров открытых вручную MAGIC=0

// ------------ Вспомогательные переменные --------------------------
string    ExpertName="0";// имя советника
string    SMB;
bool      DobroTorga;

//+------------------------------------------------------------------+
//|                  Блок инициализации                              |
//+------------------------------------------------------------------+
int init(){

  SMB=Symbol();
  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                            |
//+------------------------------------------------------------------+
int deinit(){
        if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                          |
//+------------------------------------------------------------------+
int start(){
  if(!IsTradeAllowed()){
    Comment("Торговля запрещена в настройках терминала, либо торговый поток занят");
    Print("Торговля запрещена в настройках терминала, либо торговый поток занят");
    return(0);
  }
  DobroTorga=true;
  if(SchBuy(MAGIC)+SchSell(MAGIC)+HistSchBuy(MAGIC)+HistSchSell(MAGIC)>0){
    DobroTorga=false;
  }
  if(DobroTorga==true){
    // ---- добро торговать есть - ставим ордера ---------
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+


// =================================================================================================
// ************************* Счётчики ордеров ******************************************************
// =================================================================================================

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== SchSell()  ===============================
//  Функция возвращает количество Sell-ордеров
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        SchSell++;
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================

//=========== HistSchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров сегодняшнего дня в истории
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int HistSchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchBuy++;
        }
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== HistSchSell()  ===============================
//  Функция возвращает количество Sell-ордеров сегодняшнего дня в истории
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int HistSchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================
 
Bitte helfen Sie mir mit dem Code. Ich zeichne und verschiebe manuell eine horizontale Linie, und wenn der Preis sie berührt, sollte ein Signal ausgelöst werden.
 
Alexandr24:
Bitte helfen Sie mir mit dem Code. Ich zeichne und verschiebe manuell eine horizontale Linie, und wenn der Preis sie berührt, löst er ein Signal aus.

Der Preis berührt die Linie - es gibt ein Signal. Ich verstehe es. Was ist an dem Code falsch?
 
drknn:


Sie sind heute zuständig))) Danke, ich werde es mir ansehen.
 
Entschuldigung, ich habe die Aufgabe nicht richtig gestellt)) Ich brauche einen Code, der dies ermöglicht.
 
Alexandr24:
Entschuldigung, ich habe die Aufgabe falsch gestellt)). Was Sie brauchen, ist ein Code, der dies tut.


Als erstes müssen Sie verstehen, dass eine Linie ein Objekt ist. Der Programmiercode unterscheidet die Objekte anhand ihrer Namen. Sie müssen den Namen der Linie in den Code schreiben und dann, wenn Sie die Linie in einem Diagramm ablegen, müssen Sie in die Eigenschaften der Linie gehen und den Namen so ändern, wie Sie ihn im Code geschrieben haben. Nur dann versteht der Code, dass Sie die von diesem Objekt erfassten Messwerte verarbeiten müssen.

Als nächstes müssen Sie im Code den Preis abfragen, an dem die Zeile steht. Die Anfrage wird über die Funktion double ObjectGet(string name, int prop_id) gestellt. Anstelle von name müssen Sie den Namen Ihrer Zeile angeben, und anstelle von prop_id geben Sie OBJPROP_PRICE1 an. Auf diese Weise können Sie programmatisch den Preis ermitteln, zu dem diese Zeile gesetzt ist. Im Code müssen Sie dann prüfen, ob der Preis diese Linie berührt. Beispiel: Wenn der Kurs des vorherigen Ticks unter dem Niveau liegt, auf dem die Linie festgelegt ist, und er beim aktuellen Tick diesem Niveau entspricht oder darüber liegt, dann ist diese Berührung erfolgt.

Alexander, wenn du mit dem Code nicht weiterkommst, können sie dir hier helfen. Wenn Sie möchten, dass der Code für Sie implementiert wird, wenden Sie sich bitte an https://www.mql5.com/ru/job.

 
int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----

 double n=ObjectGet("n",OBJPROP_PRICE1); 
 if (Close[0]==n&&Close[0]!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }
Ich habe dies getan, aber das Signal funktioniert nicht, wenn Close[0]==n. Wie kann man das beheben? Die Bedingungen sind erfüllt, aber aus irgendeinem Grund funktioniert es nicht.
 
Alexandr24:
Ich habe es getan, aber das Signal funktioniert nicht, wenn Close[0]==n. Wie kann man das beheben?


Nun, dem Code nach zu urteilen, haben Sie einen Indikator erstellt. Um also zu überprüfen, ob dieser Teil des Codes funktioniert, müssen Sie warten, bis der nächste Tick die Linie berührt. Es ist besser, ein Skript zu erstellen, um diesen Teil des Codes zu testen, da es Ihnen sofortige Ergebnisse liefern wird.

Als Erstes müssen Sie sicherstellen, dass der Code Ihre Zeile tatsächlich sieht. Wie macht man das? Sie müssen nach dem Preis fragen und ihn als Warnhinweis anzeigen. Tun Sie es.

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
  string LineName="1";
  double MyLine=-100;
  MyLine=ObjectGet(LineName,OBJPROP_PRICE1);
  if(MyLine>0){
    Alert ("Горизонтальная линия ",LineName," установлена на уровень = ",MyLine);
  }
  else{
    Alert("Запрос значения линии ",LineName," вренул ошибку № ",GetLastError());
  }
  return(0);
}
//+------------------------------------------------------------------+

Nachdem das Skript nun neu kompiliert wurde, öffnen wir ein beliebiges Diagramm und zeichnen eine horizontale Linie darauf. Dann geben wir seine Eigenschaften ein, und da wir der Zeile im Code den Namen "1" gegeben haben, legen wir diesen Namen auch in den Zeileneigenschaften fest:

Klicken Sie auf OK. Wir legen das Skript auf dem Chart ab und vergewissern uns, dass der Alarm den richtigen Preis zurückgegeben hat. Wir verschieben die Linie im Diagramm an eine andere Stelle und werfen das Skript wieder auf das Diagramm zurück, um sicherzustellen, dass der Code die Linie auch dann noch erkennt, wenn wir ihre Position manuell ändern.

Dann machen wir in der gleichen Weise weiter.

 

Der Indikator wird mit dem Prüfgerät bei eingeschalteter Visualisierung getestet. Ich habe den Code etwas korrigiert, denn damit ein Alarm ausgelöst wird, sollten die Werte normalisiert werden. Aber wenn Sie die Linie auf der aktuellen Bar, sagen wir eine Stunde zu bewegen, dann wird der Alarm nur 1 Mal mit anschließender Bewegung der Linie auf der aktuellen Bar Alarm aus irgendeinem Grund ausgelöst wird es nicht funktionieren. Ich muss auf eine andere Bar warten.

int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----
double b=NormalizeDouble((Close[0]),Digits);
 double n=NormalizeDouble(ObjectGet("n",OBJPROP_PRICE1),Digits); 
 if (b==n&&b!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }
Grund der Beschwerde: