Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1785

 
Nerd Trader #:
non vedere

Ma altri possono vedere(CHARTEVENT_OBJECT_CLICK)

 
Nerd Trader #:

Tutto ciò che è brillante è semplice.

L'avrei fatto

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 #:

Io lo farei.

Stessa soluzione. Ma questo non funzionerebbe per me, perché dopo aver cliccato su questa linea, ho bisogno di cancellare la prima linea, crearne un'altra, e fare in modo che segua il cursore e sia cancellata dopo aver cliccato anche su di essa. Ho fatto questo:

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());
      }
    }
  }
}
 

Pulsante premuto - crea una linea. Pulsante premuto - cancellare. È così difficile da indovinare?

Inoltre, è possibile mostrare e nascondere in modo da non doverli creare e cancellare di continuo.

 
Nerd Trader #:

Anche una soluzione. Ma questo non funziona per me, perché dopo aver cliccato su questa linea, ho bisogno di cancellare la prima linea, crearne un'altra, e fare in modo che segua il cursore e sia cancellata dopo aver cliccato anche su di essa. L'ho fatto:

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());
      }
    }
  }
}

E lascerei un controllo dell'oggetto prima di creare e cancellare

 
MakarFX #:

qualcosa è andato storto) il segnale non arriva affatto. 0 scambi.

perché con il doppio?

le mie variabili sono così:

// Параметры советника
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;   // цена открытия позиции
//+-----------------------------------------------

forse è questo il problema?

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

qualcosa è andato storto) il segnale non arriva affatto. 0 scambi.

perché con il doppio?

le mie variabili sono così:

forse è questo il problema?

Cancella questo.

double openPrice;   // цена открытия позиции
e nel codice, usare
openPrice();
 
законопослушный гражданин #:


Perché il doppio?


doppio - numeri decimali

int - numeri interi

 
MakarFX #:

Cancellatelo!

E nel codice, usate

Grazie, il segnale è sparito!

 
MakarFX #:

doppio - numeri decimali

int - numeri interi

chiaramente

Motivazione: