Hatalar, hatalar, sorular - sayfa 1521

 
Ilya Malev :
Metni, düzenleyicide varsayılan olarak oluşturulan göstergenin OnCalculate'e yapıştırın. Herhangi bir çizelgeye yerleştirin. Grafik penceresinin sol üst köşesinde göstergenin çalıştığını göreceksiniz. Gösterge listesinden "Sil"i seçtikten sonra iş durmaz, sol üst köşede görünür. Ve pencereyi kapattıktan sonra bile durmuyor. Ve yeni bir pencere açtıktan sonra yeni pencerede devam ediyor. Ayrıca, bu pencere mutlaka başlangıçtaki sembolle aynı değildir :)
Yalnızca terminal kapatıldığında gösterge çalışmayı durdurur. Ve durup durmadığı bilinmiyor - yeniden başlatmak için terminali görev yöneticisi aracılığıyla manuel olarak kaldırmak zorunda kaldım ...

IsStopped işlevinin yardımı, mql programının yürütülmesini sonlandırmak için bir komut alındığında, programın 3 saniye sonra zorla sonlandırıldığını söylerken.

Ayrıca while(true) yerine while(!IsStopped()) getirilirse, gösterge grafikten kaldırıldığında işini başarıyla tamamlar.

Temiz. Her zamanki kaldırma için bir hoşgörü yaptılar.

Terminali kapattığınızda her şey zor olacak. 3 saniyeden fazla değil.

Ve bunu belgelere yazacağımızdan emin değilim, 1. Bu kadar çılgın göstergeler yazmakla uğraşmamak (kontrol etmek için mi yazdınız?) 2. Hem zayıfladı hem de sıkılaştı.

 
Alexandre :

Dahili Derleyici Hatasının komik nedeni (göstergede kullanılan işlev):

...

Tedavi açıktır, ancak katılıyorum - çok komik bir aksaklık. :)))

Mesaj için teşekkürler!

Sana özel mesaj yazdım.
 
Merhaba. Bir önceki pozisyon açıldıktan sonra n - bar sayısı kadar pozisyon açacak bir kod yazmak mümkün değildir. Time[i], iBarShift, iTime kullanılarak denendi. Hepsi başarısız. Programlamada acemi. Arama hiçbir şey çıkmadı.
 

Dmitri Custurov :
Здравствуйте. Не получается написать код, который открывал бы позицию через n- количество баров после открытия предыдущей позиции. Пробовал использовать Time[i], iBarShift, iTime. Все безуспешно. В программировании новичок. Поиск ничего не дал.

Selamlar, hatayı bulmanıza yardımcı olabilmeniz için en azından kodu eklemeniz gerekir. Burada kimse sizin için yazmayacak - burada bir hatayı bulmaya yardımcı olmak ve düzeltmesini tavsiye etmek gelenekseldir. Veya - serbest çalışanla iletişime geçin.
 

İşte kod:

if (( OrderSelect (0,SELECT_BY_POS,MODE_TRADES)==Yanlış)&&(Sinyal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Zamanlayıcı=Zaman[0];}

TimerNull=iBarShift(NULL,0,Zamanlayıcı,yanlış);

if ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Ayrıca şöyle denedim:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Yanlış)&&(Sinyal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Zamanlayıcı=Zaman[0];}

TimerNull=Zaman[0];

if ((TimerNull>=(Timer+2700))&&(z==1)) //Örnek olarak burada n yerine 2700 saniye koydum, bu test sırasında 3 15 dakikalık mum anlamına geliyordu) {int send2= OrderSend(Symbol( ), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Ve ayrıca şöyle:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Yanlış)&&(Sinyal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Zamanlayıcı=Zaman[0];}

TimerNull=Zaman[0];

if ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red); //Bu durumda, 2700'ü kaldırdığımda, aynı çubukta ilkinden hemen sonra ikinci anlaşma açıldı ve bu mantıklı. Ve 2700 yerine 600'e kadar herhangi bir sayı koyduğumda bile aynı barda ikinci anlaşma da açıldı. Değer 600'den büyükse, ikinci ticaret hiç açılmadı. Sorunun ne olduğunu anlayamıyorum. Yardımın için çok minnettar olacağım.

Timer ve TimerNull parametreleri tarih saat biçimindedir.


 

Örneğinizde, örneğin pozisyonlar için numaralandırma yok

if (( OrderSelect (0,SELECT_BY_POS,MODE_TRADES)==Yanlış)&&(Sinyal==1))

bu yüzden her zaman 0 konumunu seçer.

 
Ana mantığın işlemesi için hala taslak bir versiyon yazıyorum. Ondan sonra kendimi geliştireceğim. Bu durumda belki yanılıyorum, sorun kodun ikinci kısmında.
 
Slawa :

Temiz. Her zamanki kaldırma için bir hoşgörü yaptılar.

Terminali kapattığınızda her şey zor olacak. 3 saniyeden fazla değil.

Ve bunu belgelere yazacağımızdan emin değilim, 1. Bu kadar çılgın göstergeler yazmakla uğraşmamak (kontrol etmek için mi yazdınız?) 2. Hem zayıfladı hem de sıkılaştı.

Peki, şimdiden sıkın veya sertifikayı düzeltin. Kendini şımartmamak, şımartmamak ciddi bir konuşma değildir. Programcılar sizden "vesayet" değil, anlaşılır, iyi belgelenmiş yazılımlar bekler.

Tabii ki, bu kodun sizin istediğiniz gösteriden başka bir amacı yoktur. Ve bu oldukça zararsızdır, Uyku'yu kaldırırsanız ve Yorumu Yazdır ile Değiştirirseniz çılgına döner. Dördünde veya beşinde günlüğe yazılan gigabaytlarca istenmeyen postaya karşı koruma yoktur.

 
Dmitri Custurov :

İşte kod:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Yanlış)&&(Sinyal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Zamanlayıcı=Zaman[0];}

TimerNull=iBarShift(NULL,0,Zamanlayıcı,yanlış);

if ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Ayrıca şöyle denedim:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Yanlış)&&(Sinyal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Zamanlayıcı=Zaman[0];}

TimerNull=Zaman[0];

if ((TimerNull>=(Timer+2700))&&(z==1)) //Örnek olarak burada n yerine 2700 saniye koydum, bu test sırasında 3 15 dakikalık mum anlamına geliyordu) {int send2= OrderSend(Symbol( ), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Ve ayrıca şöyle:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Yanlış)&&(Sinyal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Zamanlayıcı=Zaman[0];}

TimerNull=Zaman[0];

if ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red); //Bu durumda, 2700'ü kaldırdığımda, aynı çubukta ilkinden hemen sonra ikinci anlaşma açıldı ve bu mantıklı. Ve 2700 yerine 600'e kadar herhangi bir sayı koyduğumda bile aynı barda ikinci anlaşma da açıldı. Değer 600'den büyükse, ikinci ticaret hiç açılmadı. Sorunun ne olduğunu anlayamıyorum. Yardımın için çok minnettar olacağım.

Timer ve TimerNull parametreleri tarih saat biçimindedir.


İşte olası bir uygulama. bu EA, belirtilen çubuk sayısından sonra bir sipariş açmalıdır. Ve mesaj panelindeki SRC düğmesi olan danışman kodunun nasıl doğru şekilde ekleneceğini öğreniyoruz.

 //+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

input int nymber_bar= 10 ;
input double Volume_= 0.01 ;
int send1;
int send2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

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

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (Total_orders( _Symbol , OP_SELL )== 0 && send1<= 0 )
     {
      send1= OrderSend ( Symbol (), OP_SELL ,Volume_, Bid , 0 , 0 , 0 , NULL , 1 , 0 ,Red);
     }

   if ( OrderSelect (send1, SELECT_BY_TICKET ))
     {
       if ( iBarShift ( NULL , 0 , OrderOpenTime ())>=nymber_bar)
        {
         send1= OrderSend ( Symbol (), OP_SELL ,Volume_, Bid , 0 , 0 , 0 , NULL , 1 , 0 ,Red);
        }
     }

  }
//+------------------------------------------------------------------+
int Total_orders( string symbol, int type)
  {
   int n= 0 ;
   int total= OrdersTotal ();

   for ( int i= 0 ; i<total; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS ))
        {
         if ( OrderType ()!=type) continue ;
         //if(OrderMagicNumber()!=Magic)continue;
         if ( OrderSymbol ()!=symbol) continue ;
         n++;
        }
     }
   return (n);
  }
//+------------------------------------------------------------------+

111

 

Muhtemelen, Freelance hizmetinin site geliştiricilerine veya yöneticilerine soru

---

Önce: 568 iş tamamlandı, %75 kişisel

13 eser eklendi (tümü kişisel) ve şu hale geldi: 581 tamamlandı, %75 kişisel

---

Bu nedenle soru şu: deşifre plz, %75 ne anlama geliyor?

Neden: