Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1785

 
Nerd Trader #:
nicht sehen

Aber andere können sehen(CHARTEVENT_OBJECT_CLICK)

 
Nerd Trader #:

Alles Geniale ist einfach.

Ich hätte das getan

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {    
   if(ObjectGetInteger(0,"button_bs",OBJPROP_STATE))
     {
      int      x     =(int)lparam;
      int      y     =(int)dparam;
      datetime dt    =0;
      double   price =0;
      int      window=0;
     
      if(id == CHARTEVENT_MOUSE_MOVE)
        {
         if(ChartXYToTimePrice(0,x,y,window,dt,price))
           {
            if(ObjectFind(0,"H Line")!=window)
              {
               ObjectCreate(0,"H Line",OBJ_HLINE,window,dt,price);
              }
            else
            if(ObjectMove(0,"H Line",window,dt,price))
              {
               ChartRedraw(0);
              }
           }
        }
     }
   else
     {
      ObjectDelete(0,"H Line");
     }
  }
 
MakarFX #:

Ich würde dies tun.

Dieselbe Lösung. Aber das würde bei mir nicht funktionieren, denn nachdem ich auf diese Zeile geklickt habe, muss ich die erste Zeile löschen, eine weitere erstellen und diese dem Cursor folgen lassen, damit sie ebenfalls gelöscht wird, nachdem ich darauf geklickt habe. Ich habe dies getan:

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
    datetime static dt        = 0;
    double   static price     = 0;
    int      static window    = 0;
    string   static line_name;


  if(id==CHARTEVENT_OBJECT_CLICK){
    }
    //Нажатие кнопки создаёт line 1 
    if(sparam=="button"){
      line_name = "line 1";
      CreateLine(line_name, clrGreen);
    }
    //Нажатие на line 1 удаляет line 1 и создаёт line 2 
    if(sparam=="line 1"){
      ObjectDelete(0,line_name);
      line_name = "line 2";
      CreateLine(line_name, clrRed);
    }
    //Нажатие на line 2 удаляет line 2
    if(sparam=="line 2"){
      ObjectDelete(0,line_name);
    }
  }

  if(ObjectGetInteger(0,"button",OBJPROP_STATE)){
    int x = (int)lparam;
    int y = (int)dparam;
    if(ChartXYToTimePrice(0,x,y,window,dt,price)){
      if(id == CHARTEVENT_MOUSE_MOVE){
        if(ObjectMove(line_name,0,0,price))
          ChartRedraw(ChartID());
      }
    }
  }
}
 

Taste gedrückt - eine Linie erstellen. Taste gedrückt - löschen. Ist das so schwer zu erraten?

Außerdem können Sie sie ein- und ausblenden, so dass Sie sie nicht ständig erstellen und löschen müssen.

 
Nerd Trader #:

Auch eine Lösung. Aber das funktioniert bei mir nicht, denn nachdem ich auf diese Zeile geklickt habe, muss ich die erste Zeile löschen und eine weitere erstellen, die dem Cursor folgt und ebenfalls gelöscht wird, wenn ich auf sie klicke. Das habe ich getan:

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
    datetime static dt        = 0;
    double   static price     = 0;
    int      static window    = 0;
    string   static line_name;


  if(id==CHARTEVENT_OBJECT_CLICK){
    }
    //Нажатие кнопки создаёт line 1 
    if(sparam=="button"){
      line_name = "line 1";
      CreateLine(line_name, clrGreen);
    }
    //Нажатие на line 1 удаляет line 1 и создаёт line 2 
    if(sparam=="line 1"){
      line_name = "line 2";
      ObjectSetString(0,"line 1",OBJPROP_NAME,line_name);
      ObjectSetInteger(0,line_name,OBJPROP_COLOR,clrRed);
    }
    //Нажатие на line 2 удаляет line 2
    if(sparam=="line 2"){
      ObjectDelete(0,line_name);
    }
  }

  if(ObjectGetInteger(0,"button",OBJPROP_STATE)){
    int x = (int)lparam;
    int y = (int)dparam;
    if(ChartXYToTimePrice(0,x,y,window,dt,price)){
      if(id == CHARTEVENT_MOUSE_MOVE){
        if(ObjectMove(line_name,0,0,price))
          ChartRedraw(ChartID());
      }
    }
  }
}

Und ich würde eine Prüfung für das Objekt vor dem Erstellen und Löschen lassen

 
MakarFX #:

etwas ist schief gelaufen) kommt das Signal überhaupt nicht. 0 Gewerke.

Warum im Doppelpack?

Meine Variablen sehen wie folgt aus:

// Параметры советника
input string  sParametersEA = "";     // Параметры советника
input double  Lot           = 0.01;   // Количество лотов
input double  LotControl    = 0.01;   // Контрольная лотность
input int     StopLoss      = 30;     // Уровень убытка
input int     TakeProfit    = 30;     // Уровень прибыли
input int     Deviation     = 20;     // Отступ цены входа
input int     Slippage      = 3;      // Проскальзование (в пунктах)
input int     Magic         = 1;      // Индентификатор советника
input double  K_Martin1     = 2.0;    // Множитель мартин 1
input double  K_Martin2     = 2.0;    // Множитель мартин 2
input double  K_Martin3     = 2.0;    // Множитель мартин 3
input int     OrdersClose   = 5;      // Ограничение лотности мартин1
input int     OrdersClose2  = 5;      // Ограничение лотности мартин2
input int     DigitsLot     = 2;      // Точность лотности
// Параметры индикатора
input string  ParametersMA  = "";     // Параметры индикатора
input int     PeriodMA      = 14;     // Период мувинга
input int     MovingShift   = 1;      // Сдвиг мувинга
// Глобальные переменные
string AC;
datetime Start;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
double openPrice;   // цена открытия позиции
//+-----------------------------------------------

Vielleicht ist das das Problem?

 
законопослушный гражданин #:

etwas ist schief gelaufen) kommt das Signal überhaupt nicht. 0 Gewerke.

Warum im Doppelpack?

Meine Variablen sehen wie folgt aus:

vielleicht ist das das Problem?

Streichen Sie das.

double openPrice;   // цена открытия позиции
und im Code verwenden Sie
openPrice();
 
законопослушный гражданин #:


Warum das Doppelte?


double - Dezimalzahlen

int - ganze Zahlen

 
MakarFX #:

Löschen Sie das!

Und im Code verwenden Sie

Danke! Das Signal ist weg!

 
MakarFX #:

double - Dezimalzahlen

int - ganze Zahlen

eindeutig

Grund der Beschwerde: