expert advisor - verschiedene Fragen - Seite 21

 
Marco vd Heijden:

Oder du könntest einen Zähler starten, sobald das Ziehen erkannt wurde , es gibt viele Möglichkeiten, das zu tun,

(Ich habe nureinen Weg für mich - den Weg in deinem letzten Kommentar)
Herr Marco, Sie haben mir den Tag gerettet, vielen Dank, Mann.

Im Moment nicht, aber ich werde später versuchen, welche ich zusätzlich zu diesen ' SL und TP ' Funktionen hinzufügen möchte. Ich muss nur wirklich viele Dinge darüber recherchieren, bevor ich anfange, ein Skript dafür zu schreiben.

Alles Gute für dich!

 

Wenn ich mich richtig erinnere, habe ich vor langer Zeit einen "Order Modifier" EA gesehen, der so funktionierte: er wurde beim Ziehen nicht aktualisiert, wenn ich die Linie "Drag OFF" zog und dann die " Stop Loss und Take Profit " Werte nur einmal ändern konnte.
So habe ich drei und mehr Mal lesen Sie Ihre letzten Kommentar und auch versucht, ein wenig ein bisschen mehr, dass ich Updates stoppen konnte, während ich ziehen.

F: Ist esalso nicht möglich, bitte?

Vielen Dank im Voraus.

 

Nun, solange das boolesche Flag drag == 1 ist, kann man dieses Flag auch zum Deaktivieren von Updates verwenden.

Wie ich schon sagte, kann man auch einen Zähler starten, hier ist ein Beispiel dafür:

//+------------------------------------------------------------------+
//|                                                  Drag Hline2.mq4 |
//|      Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

double price;
bool drag;
int cnt=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
   ObjectCreate(0,"line",OBJ_HLINE,0,0,Ask);
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
     {
      drag=1;
     }

   if(drag==1)
     {
      cnt++;       // increase counter
        {
         if(cnt>=2)// if counter == 2 seconds
           {
            price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0); // store new value
            Print(" New price: ",DoubleToString(price));
            PlaySound("ok.wav");
            cnt=0;  // reset counter
            drag=0; // reset drag
           }
        }
     }
  }
//+------------------------------------------------------------------+

Oder einfach eine while-Schleife verwenden, die sehr gut funktioniert:

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
    {
     PlaySound("ok.wav");
     price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
     Comment(price);
    }
  }
//+------------------------------------------------------------------+
Es sagt einfach, während (ich ziehe) aktualisiere ich den Preis, bis beide gleich sind (wenn ich aufhöre zu ziehen)
 
Marco vd Heijden:

Nun, solange das boolesche Flag drag == 1 ist, kann man dieses Flag auch zum Deaktivieren von Updates verwenden.
Wie ich schon sagte, kannst du auch einen Zähler starten, hier ist ein Beispiel dafür:
Oder einfach eine while-Schleife verwenden, die sehr gut funktioniert:
Es sagt einfach, während ich ziehe, aktualisiere ich den Preis, bis sie beide gleich sind (wenn ich aufhöre zu ziehen)

( und Ihre Codes )

Was für ein brillantes Beispiel, Mann?! Das ist wirklich ein sehr nützlicher Kommentar, vielen Dank. Und jetzt versuche ich, mehr Dinge für diese Zeilen hinzuzufügen (Designs und Funktionen ).
( Bitte nehmen Sie es mir nicht übel, dass ich diese Frage stelle: Ich habe " graphics() ", das ich für grafische Objekte verwende, und ich rufe es durch Init() auf und ich muss es durch OnTimer() aufrufen, also ist meine Frage: Mache ich etwas falsch, bitte? )

Alles Gute für Sie!

 

Sie können auf die Fehlermeldung 4200 stoßen, die besagt, dass das Objekt nicht erstellt werden konnte, weil es bereits existiert.

Sie müssen also prüfen, ob das Objekt bereits existiert, bevor Sie es (erneut) erstellen oder ändern.

Sie können verwenden:

   if(ObjectFind(0,"Long")<0)
     {
      //Object does not exist

     }
  
and/or

   if(ObjectFind(0,"Long")>=0)
     {
      // Object already exists
    
     }
 
Marco vd Heijden:

Sie können es verwenden:

Hmm, das ist wirklich eine neue Funktion für mich.
Ich könnte es versuchen, nachdem ich darüber recherchiert habe. (Ich habe sie schon oft gesehen, aber ich habe sie noch nie benutzt).

Vielen Dank!

 

#Preis in Pixel umwandeln - Öffnen

Ich verwende "HLine" für die Take Profit Funktion.
Ich habe einige Objekte (Label, RecLabel... und so weiter) und ich möchte, dass Objekte mit "HLine" Objekt bewegen könnte. Also habe ich untenstehende Funktion gefunden. Aber ich möchte nicht "X" konvertieren. Ich möchte nur den Preis in Y umwandeln.
Ich habe nie etwas mit dem untenstehenden Code versucht.
F: Weil
ich sicher sein möchte, dass es mir für mein Anliegen helfen könnte?
(Wenn ich weiß, dass es mir helfen könnte, werde ich es für mein Anliegen ausprobieren).
F: Und gibt es irgendwelche Methoden für einige Objekte, die sich mit "HLine" bewegen können?

// this is just example for that what I am thinking
datetime time = 0; // I just want to ignore this because I just want to give to X = 20; fixed mode ( should not change ever )
double price = ObjectGetDouble( 0, "line", OBJPROP_PRICE, 0 );

int x,y;

ChartTimePriceToXY( long chart_id, int sub_window, datetime time, double price, int& x, int& y );

Vielen Dank im Voraus.

 

Sie müssen ein wenig spezifischer sein, denn Sie können viele Dinge auf viele Arten tun.

Diese Funktionen werden in der OnChartEvent() Funktion verwendet.

ChartPriceToXY - gibt Ihnen die Preis-Zeit-Konvertierung in Koordinaten, ist es wirklich das, was Sie brauchen?

Vielleicht meinen Sie ChartXYToTimePrice() ?

https://www.mql5.com/en/docs/chart_operations/chartxytotimeprice

Wenn Sie den Wert nicht benötigen, können Sie ihn einfach als Null übergeben, siehe Beispiel unten.

//+------------------------------------------------------------------+
//|                                                    CrossHair.mq4 |
//|      Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create some lines
   ObjectCreate(0,"X",OBJ_HLINE,0,0,Ask);          // X = Horizontal Axis (time==0)
   ObjectCreate(0,"Y",OBJ_VLINE,0,TimeCurrent(),0);// Y = Vertical Axis (price==0)      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- clean up  
   ObjectsDeleteAll(0,0,EMPTY);  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- If this is an event of a mouse click on the chart
   if(id==CHARTEVENT_CLICK)
     {
      //--- Prepare variables
      int      x     =(int)lparam;
      int      y     =(int)dparam;
      datetime time  =0;
      double   price =0;
      int      window=0;
      //--- Convert the X and Y coordinates in terms of date/time
      if(ChartXYToTimePrice(0,x,y,window,time,price))
        {
         ObjectMove(0,"X",0,0,price); // notice time==0 because horizontal axis
         ObjectMove(0,"Y",0,time,0);  // notice price==0 because vertical axis
        }
      else
         Print("ChartXYToTimePrice return error code: ",GetLastError());
      Print("+--------------------------------------------------------------+");
     }
  }  
//+------------------------------------------------------------------+



Documentation on MQL5: Chart Operations / ChartXYToTimePrice
Documentation on MQL5: Chart Operations / ChartXYToTimePrice
  • www.mql5.com
Chart Operations / ChartXYToTimePrice - Reference on algorithmic/automated trading language for MetaTrader 5
 

Ich habe bereits gelesen, dass die Dokumentation, aber ich war nicht klar herausgefunden, es bis zu Ihrem letzten Kommentar. Eigentlich aber ich nicht versucht, noch, weil ich unten Code kämpfen, ich habe bereits versucht, einige Möglichkeiten für gute Ergebnisse, aber ich kann nicht.
Herr Marco
, vielen Dank für Ihren letzten tollen Kommentar, den ich für mein Problem mit den Objektbewegungen verwenden kann.

Ich habe wirklich viel Zeit damit verbracht, eine Lösung für mein Problem zu finden, ich kann keine guten Ergebnisse erzielen.
Aber wie auch immer, ich kann (derzeit offenen Positionen) Take Profit Preise, die ich will "hline" Objekte könnte Take Profit Preise zu sich selbst aufrufen, und es ist Arbeit. Und es funktioniert nur die ersten Male. Ja ich weiß, weil es in " Init() " ist. Aber ich habe versucht, es in "OnTimer()" einzufügen, aber es funktioniert nicht richtig.

Bitte lassen Sie mich wissen, etwas, das mir helfen, herauszufinden, was ich lernen könnte, und für meine dieses Problem zu tun.
Ich werde nach 7 Stunden wieder anfangen, über dieses Problem zu forschen.
Wenn ich einen guten Kommentar erhalte, wird das besser für mich sein.

// init()------------------------------------------------------------

for ( i = OrdersTotal() - 1; i >= 0; i-- )
{
    if  ( ! OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) ) continue;
    if  ( OrderSymbol() == Symbol() ) tpprice = OrderTakeProfit();

    ObjectCreate    (
                        "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", // name
                        OBJ_HLINE,
                        0,      // subwindow
                        0,      // time
                        tpprice // price1
                    );
    tpprice =
    ObjectGetDouble (
                        0,
                        "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", // name
                        OBJPROP_PRICE, 0
                    );

}
// ontimer() --------------------------------------------------------

if  ( tpprice != ObjectGetDouble( 0, "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", OBJPROP_PRICE, 0 ) )
{
    tpdrag = 1;
}

if  ( tpdrag == 1 )
{
    tpprice = ObjectGetDouble( 0, "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", OBJPROP_PRICE, 0 );
    Print( "tpdrag: ", tpdrag, " - Price: ", DoubleToString( tpprice, Digits ) );

    // actually here is a graphical objects functin()
    // here one of them
    // also which one soon I will try to  below objects could moves together " tphline " - but I can't take a time to research about your latest comment and so...
    ObjectCreate( "recl object", OBJ_RECTANGLE, 0, 0, tpprice ); // I feel I could add something to " string name " - I already tried few things not good results

    tpdrag = 0;
}

//---
return;

Vielen Dank im Voraus.
Alles Gute für Sie!

 

Bitte benutzen Sie den Styler unter der Registerkarte Tools.

Ich habe keine Ahnung, was Sie zu erreichen versuchen, also muss ich raten, was Sie tun wollen, was nie gut ist.

Aber Sie können sich das Beispiel hier ansehen:

//+------------------------------------------------------------------+
//|                                                    Stealth 4.mq4 |
//|      Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

static input int takeprofit=500;// Take Profit
static input int stoploss=500;  // Stop Loss

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
           {
            if(Symbol()==OrderSymbol()) // only for current chart symbol
              {
               switch(OrderType())
                 {
                  case OP_BUY: // for buy order
                    {
                     // if objects not found - create them
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")<0)
                       {
                        ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJ_HLINE,0,0,OrderOpenPrice()+takeprofit*Point());
                        ObjectSet("#"+IntegerToString(OrderTicket())+"-TP",7,3);
                       }
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")<0)
                       {
                        ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJ_HLINE,0,0,OrderOpenPrice()-stoploss*Point());
                        ObjectSet("#"+IntegerToString(OrderTicket())+"-SL",7,3);
                       }
                     // if objects exist
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")>=0)
                       {
                        if(Bid>ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJPROP_PRICE,0))
                          {
                           bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
                             {
                              if(close==0)
                                {
                                 Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
                                }
                              if(close==1)
                                {
                                 Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to TP Profit = "+DoubleToString(OrderProfit(),2));
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
                                }
                             }
                          }
                       }
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")>=0)
                       {
                        if(Ask<ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJPROP_PRICE,0))
                          {
                           bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
                             {
                              if(close==0)
                                {
                                 Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
                                }
                              if(close==1)
                                {
                                 Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to SL Profit = "+DoubleToString(OrderProfit(),2));
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
                                }
                             }
                          }
                       }
                    }
                  break;

                  case OP_SELL: // for sell order
                    {
                     // if objects not found - create them
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")<0)
                       {
                        ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJ_HLINE,0,0,OrderOpenPrice()-takeprofit*Point());
                        ObjectSet("#"+IntegerToString(OrderTicket())+"-TP",7,3);
                       }
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")<0)
                       {
                        ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJ_HLINE,0,0,OrderOpenPrice()+stoploss*Point());
                        ObjectSet("#"+IntegerToString(OrderTicket())+"-SL",7,3);
                       }
                     // if objects exist
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")>=0)
                       {
                        if(Ask<ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJPROP_PRICE,0))
                          {
                           bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
                             {
                              if(close==0)
                                {
                                 Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
                                }
                              if(close==1)
                                {
                                 Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to TP Profit = "+DoubleToString(OrderProfit(),2));
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
                                }
                             }
                          }
                       }
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")>=0)
                       {
                        if(Bid>ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJPROP_PRICE,0))
                          {
                           bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
                             {
                              if(close==0)
                                {
                                 Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
                                }
                              if(close==1)
                                {
                                 Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to SL Profit = "+DoubleToString(OrderProfit(),2));
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
                                }
                             }
                          }
                       }
                    }
                  break;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+


Sie können also sehen, dass Sie ObjectGetDouble direkt verwenden können, es gibt keine Notwendigkeit, den Wert in ein anderes Double zu kopieren, weil das Objekt selbst den Wert hält, und wenn Sie die Zeile ziehen, ändert sich der Wert automatisch und wird beim nächsten Mal, wenn Sie ihn lesen, angezeigt.

Grund der Beschwerde: