[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 1126

 
drknn :


Kod doğru değil. İlk olarak, start() işlevi int türündeyse, bir tamsayı değeri döndürmesi gerekir. Dönüşte sadece bir şartla iade edilir. Ve koşul karşılanmazsa, Başlat işlevi terminale ne dönmelidir?

Ayrıca, kontrolü çok karmaşık hale getirdiniz - bunu yapmak daha iyidir: bugün açılan ve kapanan siparişlerin bir sayacını yapıyoruz. Bugünkü siparişlerin sayısı sıfırdan büyükse, ticaret yapmayız. Aksi takdirde, ticarete izin verilir.

int void olarak değiştirildi... yardımcı olmadı

Dürüst olmak gerekirse, bir sipariş sayacının nasıl yapıldığını tam olarak anlamıyorum ve aynı zamanda bir kerelik günlük ticaret seçeneğini etkinleştirme / devre dışı bırakma özelliğini koruyorum ....

.... Düşündüm ve düşündüm: Bunu deneyeceğim

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

{

CheckForOpen();

if (WaitForNewDay) {Siparişler++;}

dönüş;

}

Sayacı sıfırla:

if(WaitForNewDay)CheckForNewDay();

geçersiz CheckForNewDay()

{

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

if (bt!=tm) {bt=tm; siparişler=0;}

}

Genel olarak, kaçtığı şeye geri döndü)))

 
dzhini :

int void olarak değiştirildi... yardımcı olmadı

Dürüst olmak gerekirse, bir sipariş sayacının nasıl yapıldığını tam olarak anlamıyorum ve aynı zamanda bir kerelik günlük ticaret seçeneğini etkinleştirme / devre dışı bırakma özelliğini koruyorum ....

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

Genel olarak, kaçtığım şeye geri döndüm)))

 //+------------------------------------------------------------------+
//|                                                            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);     
}                  
//==================================================================================================
 
Değerli forum kullanıcıları kod konusunda yardımcı olur. Durum şu ki, yatay bir çizgiyi manuel olarak çizip hareket ettiriyorum ve fiyat ona dokunduğunda bir sinyal tetiklenmesi gerekiyor.
 
Alexandr24 :
Değerli forum kullanıcıları kod konusunda yardımcı olur. Durum şu ki, yatay bir çizgiyi manuel olarak çizip hareket ettiriyorum ve fiyat ona dokunduğunda bir sinyal tetikleniyor.

Fiyat çizgiye dokundu - bir sinyal var. Bu temiz. Kodun nesi var?
 
drknn :


Bugün bu konudan siz sorumlusunuz))) teşekkür ederim. bunu halledeceğim
 
Üzgünüm, görevi yanlış ayarladım)) Bunu yapacak gerçek koda ihtiyacımız var.
 
Alexandr24 :
Üzgünüm, görevi yanlış ayarladım)) Bunu yapacak gerçek koda ihtiyacımız var.


Anlamanız gereken ilk şey, bir çizginin bir nesne olduğudur. Program kodu nesneleri adlarına göre ayırır. Kodun içine satırın adını yazmanız ve ardından satırı grafiğe bıraktığınızda, özelliklerini girmeniz ve adı kodda yazılan adla değiştirmeniz gerekir. Sadece bu durumda kod, bu nesneden alınan okumaların işlenmesi gerektiğini anlayacaktır.

Kodun yanında, hattın bulunduğu fiyatı talep etmeniz gerekir. İstek, double ObjectGet (dize adı, int prop_id) işlevi aracılığıyla yapılır. Ad yerine satırınızın adını belirtmeniz ve prop_id yerine OBJPROP_PRICE1 belirtmeniz gerekir. Böylece, bu satırın ayarlandığı fiyatı programlı olarak alabilirsiniz. Bu değeri alın ve bir değişkende saklayın. kodun devamında, bu satırın fiyatına dokunmak için bir çek düzenlemeniz gerekir. Örneğin: Bir önceki tikte fiyat, çizginin bulunduğu seviyenin altındaysa ve aynı zamanda mevcut tikte bu seviyeden büyük veya ona eşitse, bir dokunma meydana geldi.

Alexander, kodlu bir şey senin için işe yaramazsa, o zaman burada yardımcı olacaklar. Kodun sizin yerinize yapılması gerekiyorsa, buraya gidebilirsiniz https://www.mql5.com/en/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 );
  }
Bunu yaptı, ancak Kapat[0]==n olduğunda sinyal bir nedenle çalışmıyor. Nasıl düzeltirsin? Koşullar karşılanıyor ama nedense çalışmıyor.
 
Alexandr24 :
Bunu yaptı, ancak Kapat[0]==n olduğunda sinyal bir nedenle çalışmıyor. Nasıl düzeltirsin?


Eh, koda bakılırsa, bir gösterge yapmışsın. Bu nedenle, kodun bu bölümünün performansını kontrol etmek için oturmanız ve bir sonraki onay işaretinin çizgiye dokunmaya tenezzül etmesini beklemeniz gerekecektir. Bu kod bölümünde hata ayıklamak için bir komut dosyası oluşturmayı kullanmak daha iyidir - anında sonuç verecektir.

Emin olmanız gereken ilk şey, kodun gerçekten satırınızı görmesidir. Nasıl yapılır? Fiyatını talep etmeniz ve ekranda bir uyarı görüntülemeniz gerekir. Yaparız.

 //+------------------------------------------------------------------+
//| 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 );
}
//+------------------------------------------------------------------+

Komut dosyası yeniden derlendiğine göre, herhangi bir grafiği açın ve üzerine yatay bir çizgi çizin. Sonra onun özelliklerini giriyoruz ve kodda satıra "1" ismini atadığımız için satırın özelliklerine bu ismi de koyuyoruz:

Tamam'a basıyoruz. Senaryoyu grafiğe atıyoruz ve uyarının bize doğru fiyatı döndürdüğünden emin oluyoruz. Çizgiyi grafik boyunca başka bir yere taşırız ve komut dosyasını tekrar grafiğin üzerine atarız - çizginin konumunu ellerimizle değiştirirsek, kodumuzun hala onu görüp tanıdığından emin oluruz.

Peki, aynı ruhla devam edin.

 

Göstergeyi, görselleştirmenin etkin olduğu bir test cihazı aracılığıyla test ediyorum. Bir uyarıyı tetiklemek için değerlerin normalleştirilmesi gerektiğinden kodu biraz düzelttim. Ancak mevcut çubuktaki satırı yeniden düzenlerseniz, diyelim ki saatlik bir saat, o zaman uyarı sadece 1 kez satır geçerli çubuk boyunca hareket ettiğinde çalışır, uyarı çalışmaz. Başka bir bar beklemek zorundasın.

 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 );
  }
Neden: