Çaydanlıktan gelen sorular - sayfa 262

 
agvozdezkiy :

MQL öğrenmeye yeni başladım ve şimdi iMA çizen ve fare işaretçisinin zaman ekseni boyunca bulunduğu noktada iMA'daki çizelgeye teğet (çok yaklaşık) çizen bir Uzman Danışman yazdım .

Sorun bir. Danışman çok aptal. Yani tanjant uzun süre yeniden çizilir ve farenin hareketine ayak uyduramaz...

Sürümüme göz atın:

 //+------------------------------------------------------------------+
//|                                                Antonio_Mouse.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//---
int Handle_iMA;
double Buffer_iMA[];
string Name_iMA;
datetime TimeArray[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---Устанавливаем свойство графика посылать события при движении мышы     
   ChartSetInteger ( 0 , CHART_EVENT_MOUSE_MOVE , true );
//---Рисуем индикатор iMA
   Handle_iMA= iMA ( NULL , 0 , 10 , 0 , MODE_SMA , PRICE_CLOSE );
   if (Handle_iMA!= INVALID_HANDLE )
     {
       ChartIndicatorAdd ( 0 , 0 ,Handle_iMA);
       Print ( "iMA скопировано в буффер." );
     }
//---
   string name= "Line" ;
   ObjectCreate ( 0 ,name, OBJ_TREND , 0 , 0 , 0 );
   ObjectSetInteger ( 0 ,name, OBJPROP_COLOR , clrRed );
   ObjectSetInteger ( 0 ,name, OBJPROP_WIDTH , 10 );
   ObjectSetInteger ( 0 ,name, OBJPROP_BACK , true );
   ObjectSetInteger ( 0 ,name, OBJPROP_RAY_LEFT , false );
   ObjectSetInteger ( 0 ,name, OBJPROP_RAY_RIGHT , true );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   IndicatorRelease (Handle_iMA);
  }
datetime CarrentBarTime[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
  }
double PriceCoord,Angle;
datetime TimeCoord;
int SubWindow,BarPos,X1,Y1,X2,Y2;
int prevX=- 1 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &XCoord,
                   const double &YCoord,
                   const string &SParam)
  {
   if (id== CHARTEVENT_MOUSE_MOVE )
     {
       int x=( int )XCoord;
       int y=( int )YCoord;
       if (x==prevX) return ;
       CopyTime ( NULL , 0 , 0 , 1 ,CarrentBarTime);
       //---
       ChartXYToTimePrice ( NULL ,x,y,SubWindow,TimeCoord,PriceCoord);
       if (TimeCoord>CarrentBarTime[ 0 ]) return ;
       CopyBuffer (Handle_iMA, 0 ,TimeCoord+ PeriodSeconds (), 2 ,Buffer_iMA);
       //---
       string name= "Line" ;
       ObjectSetDouble ( 0 ,name, OBJPROP_PRICE , 0 ,Buffer_iMA[ 0 ]);
       ObjectSetInteger ( 0 ,name, OBJPROP_TIME , 0 ,TimeCoord);
       ObjectSetDouble ( 0 ,name, OBJPROP_PRICE , 1 ,Buffer_iMA[ 1 ]);
       ObjectSetInteger ( 0 ,name, OBJPROP_TIME , 1 ,TimeCoord+ PeriodSeconds ());
       //---
       ChartRedraw ();
      prevX=x;
     }
  }

Bir dizüstü bilgisayarda - her şey uçar!

 

Nesne oluşturma işlevini ilk çağırdığımda 5040 (Dize türünde bozuk parametre) hatası alıyorum

 void   CreateTL( string name, datetime time1, double price1, datetime time2, double price2, bool ray_left, bool ray_right, color color_TL)
  {
//------------ nTL,nTLh,nTLl,nTLe
   nTL= "nTL_" + IntegerToString ( MathRand ());
   nTLh= "nTLh_" + IntegerToString ( MathRand ());
   nTLl= "nTLl_" + IntegerToString ( MathRand ());
   nTLe= "nTLe_" + IntegerToString ( MathRand ());
//------------
   ObjectCreate ( 0 ,name, OBJ_TREND , 0 ,time1,price1,time2,price2);
   ObjectSetInteger ( 0 ,name, OBJPROP_COLOR ,color_TL);
   ObjectSetInteger ( 0 ,name, OBJPROP_STYLE , STYLE_DOT );
   ObjectSetInteger ( 0 ,name, OBJPROP_RAY_RIGHT ,ray_left);
   ObjectSetInteger ( 0 ,name, OBJPROP_RAY_RIGHT ,ray_right);
   ObjectSetInteger ( 0 ,name, OBJPROP_BACK , true );
  };

Aramadan önce ayarlarsanız

nTL= "" ;

4002 hatası (Bir istemci terminal işlevi dahili olarak çağrılırken yanlış parametre)

Aramadan önce ayarlarsanız

nTL= "a" ;

ilk nesne a olarak adlandırılacaktır.

böyle aramak

 if (hlp_var==high_low)
     {
       //CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTL,dt[ 0 ],pr[ 0 ],dt[ 0 ],pr[ 1 ], false , false ,nTL_color);
      CreateTL(nTLe,dt[ 1 ],pr[ 0 ],dt[ 1 ],pr[ 1 ], false , false ,nTL_color);
      CreateTL(nTLh,dt[ 0 ],pr[ 0 ],dt[ 1 ],pr[ 0 ], false , true ,nTL_color);
      CreateTL(nTLl,dt[ 0 ],pr[ 1 ],dt[ 1 ],pr[ 1 ], false , true ,nTL_color);
      CreateTL(nTL,dt[ 0 ],pr[ 0 ],dt[ 1 ],pr[ 1 ], false , true ,nTL_color);
      CreateTL(nTL,dt[ 0 ],pr[ 1 ],dt[ 1 ],pr[ 0 ], false , true ,nTL_color);
       Print ( "CreateTL GetLastError " + IntegerToString ( GetLastError ()));
     };

Söyle bana, hata nerede?

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 

eski sürümde

 ObjectCreate ( 0 ,nTL= "nTL_" + IntegerToString ( MathRand ()), OBJ_TREND , 0 ,time1,price1,time2,price2);

hiç çökme olmadı.

Bu kodda veya terminalde bir hata mı?

 
Silent :

Söyle bana, hata nerede?

xs hatası nerede, ancak nesne adlarıyla çalışmak, hafifçe söylemek gerekirse, çok tartışmalı.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
Nesne adına neden rastgele bir sayıya ihtiyacınız olduğu açık değil, bu bir hataya neden olabilir.
 
Silent :

Nesne oluşturma işlevini ilk çağırdığımda 5040 (Dize türünde bozuk parametre) hatası alıyorum

Aramadan önce ayarlarsanız

4002 hatası (Bir istemci terminal işlevi dahili olarak çağrılırken yanlış parametre)

Aramadan önce ayarlarsanız

ilk nesne a olarak adlandırılacaktır.

böyle aramak

Söyle bana, hata nerede?

Sıfırdan farklı bir şey yazdırırken Son Hatayı Al konusunda endişeli misiniz? Eğer öyleyse, sadece fonksiyon bir hata bildirdiyse bir hata istemeye değer. Ve bölümün sonunda hata istemeye değmez, çöp bir değer alabilirsiniz. Yani MT4'te belki burada bir şekilde farklıdır.

sözde kod:

 if ( ! ObjectCreate (...) )
     Print ( GetLastError () );
 
Silent :

Nesne oluşturma işlevini ilk çağırdığımda 5040 (Dize türünde bozuk parametre) hatası alıyorum

Aramadan önce ayarlarsanız

4002 hatası (Bir istemci terminal işlevi dahili olarak çağrılırken yanlış parametre)

Aramadan önce ayarlarsanız

ilk nesne a olarak adlandırılacaktır.

böyle aramak

Söyle bana, hata nerede?

Dizeleri StringConcatenate() "glue" ile deneyin

 
TheXpert :
xs hatası nerede, ancak nesne adlarıyla çalışmak, hafifçe söylemek gerekirse, çok tartışmalı.
Bir hafta daha kafamı kaşıyacağım. Biraz daha detaylı mümkün mü? (kaba olabilir :))
zfs :
Nesne adına neden rastgele bir sayıya ihtiyacınız olduğu açık değil, bu bir hataya neden olabilir.

Benzersiz adlara sahip birkaç yüz nesne için başka bir seçenek var mı?

(Grubu kaldırmak için bir nesne grubu adında aynı dize kısmına sahip olmalıdır.)

 
220Volt :

Sıfırdan farklı bir şey yazdırırken Son Hatayı Al konusunda endişeli misiniz? Eğer öyleyse, sadece fonksiyon bir hata bildirdiyse bir hata istemeye değer. Ve bölümün sonunda hata istemeye değmez, çöp bir değer alabilirsiniz. Yani MT4'te belki burada bir şekilde farklıdır.

Hayır, çünkü ilk çağrı bir nesne oluşturamıyor. İlk aramanın satırını (şimdilik), ardından oluşturduğu ikinci başlatmadan itibaren çoğaltırım.
 
220Volt :

Sıfırdan farklı bir şey yazdırırken Son Hatayı Al konusunda endişeli misiniz?

Genel olarak, mantıksal olarak, işlev son hatayı ortaya çıkarırsa, işlevin başarıyla tamamlanmasının ardından, sıfır hata değeri veya belgelerde açıklanan değer olmalıdır. Ve başka bir şey değil.

Onlar. arama başarılıysa ve hata sıfır değilse, bu durum belgelerde açıklanmalıdır.

sessiz :

Bir hafta daha kafamı kaşıyacağım. Biraz daha detaylı mümkün mü? (kaba olabilir :))

Eh, genellikle aynı türdeki nesnelerin adları, silme kolaylığı (sizin için "nTL_") ve farklılıklar için ortak bir bölümden oluşturulur. Aynı anda bu modüllerden birden fazla olabilirse, modül tanımlayıcısını da kullanırım.

Fark, herhangi bir şey olabilir, hatta her nesne oluşturduğunuzda artırdığınız sayaç bile. Ancak, garantili benzersizliği elde etmek için mantığa göre - nesnenin zamanı, nesnenin koordinatı, amacı - ayrımlar yapmak daha iyidir. Olumlu bir yan etki, adı yeniden oluşturarak, önceden oluşturulmuş istenen nesnenin özelliklerini değiştirebilmenizdir.

Rastgele bu "garantili benzersizliği" vermez.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5