Uzmanlar için soru

 

Merhaba. Programcılar lütfen yardım edin.

Uzman: Stokastik alım geçişi ve aşırı satım bölgesinde (25'in altında) sinyal ve

Pivot, fiyat seviyesinin altında (bir tür destek); satış tam tersidir, Pivot fiyat seviyesinin üzerindedir.

Testler programlama kusurlarını gösterdi. 1) sinyal başına sadece bir anlaşmanın açılması için nasıl yapılır (test sürecinde, sinyal hala geçerliyken (yanlış) her şey sızdırıldı ve pozisyonu kapatma koşulu zaten geldi). 2) Pivot'un fiyat seviyesinin üstünde / altında olması koşulunu doğru ayarlayıp ayarlamadığım. Test programına bakarken şüphe ortaya çıktı.

Bay programcılar, somut örneklerle mümkünse yardımcı olur. Ve sonra basit derleme düzeyinde programlama biliyorum !!!!!!!

dış çift Lot = 0.1;

//+------------------------------------------- --------------------+
//| |
//+------------------------------------------- --------------------+
int başlangıç()
{
çift P_up0,P_down0,P_up1,P_down1;
çift st_m1, st_s1, st_m2, st_s2, Pivot, ma_s1;
int cnt, bilet, toplam;

if(çubuklar<100)
{
Print("100'den küçük barlar");
dönüş(0);
}
P_up0=iCustom(0,0,"Fiyat kanalı",11,0,0);
P_down0=iCustom(0,0,"Fiyat Kanalı",11,1,0);
P_up1=iCustom(0,0,"Fiyat kanalı",11,0,1);
P_down1=iCustom(0,0,"Fiyat kanalı",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Özet=iÖzel(0,0,"Özet",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
// tüm verileri ayarla

toplam=SiparişToplam();
if(toplam<1)
{
// Serbest marjı kontrol et
if(AccountFreeMargin()<(1000*Lots))
{
Print("Paramız yok. Serbest Marj = ", AccountFreeMargin());
dönüş(0);
}
// SATIN AL pozisyonu açma koşulu
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
bilet=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Yeşil);
if(bilet>0)
{
if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES)) Print("SATIN AL emri açıldı : ",OrderOpenPrice());
}
else Print("SATIN AL emri açılırken hata oluştu : ",GetLastError());
dönüş(0);
}
// SATIŞ pozisyonu açma koşulu
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
bilet=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
if(bilet>0)
{
if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES)) Print(" SAT emri açıldı : ",OrderOpenPrice());
}
else Print("SATIŞ emrini açarken hata: ",GetLastError());
dönüş(0);
}
dönüş(0);
}
for(cnt=0;cnt<toplam;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SAT &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // uzun pozisyon açık
{
// uzun bir pozisyonu kapatmak için koşul
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
dönüş(0);
}
}
başka
{
// bir kısa pozisyonu kapatmak için koşul
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
dönüş(0);
}
}
}
}
dönüş(0);
}




Dosyalar:
pivot.mq4  2 kb
 
Kostay :

Merhaba. Programcılar lütfen yardım edin.

Uzman: Stokastik alım geçişi ve aşırı satım bölgesinde (25'in altında) sinyal ve

Pivot, fiyat seviyesinin altında (bir tür destek); satış tam tersidir, Pivot fiyat seviyesinin üzerindedir.

Testler programlama kusurlarını gösterdi. 1) sinyal başına sadece bir anlaşmanın açılması için nasıl yapılır (test sürecinde, sinyal hala geçerliyken (yanlış) her şey sızdırıldı ve pozisyonu kapatma koşulu zaten geldi). 2) Pivot'un fiyat seviyesinin üstünde / altında olması koşulunu doğru ayarlayıp ayarlamadığım. Test programına bakarken şüphe ortaya çıktı.

Bay programcılar, somut örneklerle mümkünse yardımcı olur. Ve sonra basit derleme düzeyinde programlama biliyorum !!!!!!!

harici çift Lot = 0.1;

//+------------------------------------------- --------------------+
//| |
//+------------------------------------------- --------------------+
int başlangıç()
{
çift P_up0,P_down0,P_up1,P_down1;
çift st_m1, st_s1, st_m2, st_s2, Pivot, ma_s1;
int cnt, bilet, toplam;

if(çubuklar<100)
{
Print("100'den küçük barlar");
dönüş(0);
}
P_up0=iCustom(0,0,"Fiyat kanalı",11,0,0);
P_down0=iCustom(0,0,"Fiyat kanalı",11,1,0);
P_up1=iCustom(0,0,"Fiyat kanalı",11,0,1);
P_down1=iCustom(0,0,"Fiyat kanalı",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Özet=iÖzel(0,0,"Özet",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
// tüm verileri ayarla

toplam=SiparişToplam();
if(toplam<1)
{
// Serbest marjı kontrol et
if(AccountFreeMargin()<(1000*Lots))
{
Print("Paramız yok. Serbest Marj = ", AccountFreeMargin());
dönüş(0);
}
// SATIN AL pozisyonu açma koşulu
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
bilet=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Yeşil);
if(bilet>0)
{
if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES)) Print("SATIN AL emri açıldı : ",OrderOpenPrice());
}
else Print("SATIN AL emri açılırken hata oluştu : ",GetLastError());
dönüş(0);
}
// SATIŞ pozisyonu açma koşulu
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
bilet=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
if(bilet>0)
{
if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES)) Print("SAT emri açıldı : ",OrderOpenPrice());
}
else Print("SATIŞ emrini açarken hata: ",GetLastError());
dönüş(0);
}
dönüş(0);
}
for(cnt=0;cnt<toplam;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SAT &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // uzun pozisyon açık
{
// uzun bir pozisyonu kapatmak için koşul
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
dönüş(0);
}
}
başka
{
// bir kısa pozisyonu kapatmak için koşul
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
dönüş(0);
}
}
}
}
dönüş(0);
}

1) sinyal başına sadece bir işlem nasıl açılır

böyle gerekir:

 if ( total < 1 ) 
     {
       if ( AccountFreeMargin () < ( 1000 * Lots ))
         {
         Print ( " We have no money. Free Margin = " , AccountFreeMargin ()) ;
         return ( 0 ) ;  
         }
         

if ( st_m2 > st_s2 && st_m1 > st_s1 && st_m2 < 25 && Pivot < ma_s1 )
{

         ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , 3 , 0 , 0 , "" , 0 , 0 , Green ) ;

         if ( ticket > 0 )
           {
             if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ))
               Alert ( " Покупка: " , OrderOpenPrice ()) ;                      
           }
         else Alert ( " ошибка:по цене " , OrderOpenPrice ()) ; 
         return ( 0 ) ; 
         }
        
        
     return ( 0 ) ;
     }
 
Aynı yerde, tüm depozitoyu kaybettim!
 

Bu kodun neyi değiştirdiğini hala anlamıyorum. her şey aynı gibi mi?

Yine de, sinyal başına sadece bir pozisyon açacak şekilde nasıl programlanabilir,

ve aynı çubuktaki pozisyon kapatılmışsa (yani sinyal hala geçerlidir), o zaman yenisi açılmamalıdır.

 
Kostay :

...Ve yine de, sinyal başına sadece bir pozisyon açmak için nasıl programlayabilirsiniz,

ve aynı çubuktaki pozisyon kapatılmışsa (yani sinyal hala geçerlidir), o zaman yenisi açılmamalıdır.

Sipariş açılış süresi kapalı olanlar da dahil olmak üzere mevcut çubuğa (sinyalin göründüğü) aitse, çitin üzerinde sigara içiyoruz.

Aşağı yukarı şöyle:

 bool flag = true ;
int cnt = OrdersTotal () - 1 ;
for ( int i = cnt ; i >= 0 ; i -- ) {
   if ( ! OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) continue ;
   if ( OrderOpenTime () >= Time [ 0 ]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
       flag = false ;
       break ;
   }
}
cnt = OrdersHistoryTotal () - 1 ;
for ( i = cnt ; i >= 0 ; i -- ) {
   if ( ! OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY )) continue ;
   if ( OrderOpenTime () >= Time [ 0 ]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
       flag = false ;
       break ;
   }
}
if ( ! flag ) return ; 
 

Bu mevcutsa, aynı anda 1'den fazla pozisyon nasıl açık olabilir:

total= OrdersTotal ();
if(total<1)

?
 

Kodunuzu danışmana yapıştırın. ama sonuç aynı.

Cad'yi yanlış takmış olmalıyım. Bak lütfen.

dış çift Lot = 0.1;
bool flag=true;
//+------------------------------------------- --------------------+
//| |
//+------------------------------------------- --------------------+
int başlangıç()
{
çift P_up0,P_down0,P_up1,P_down1;
çift st_m1, st_s1, st_m2, st_s2, Pivot, ma_s1;
int cnt, bilet, toplam;

if(çubuklar<100)
{
Print("100'den küçük barlar");
dönüş(0);
}
P_up0=iCustom(0,0,"Fiyat kanalı",11,0,0);
P_down0=iCustom(0,0,"Fiyat kanalı",11,1,0);
P_up1=iCustom(0,0,"Fiyat kanalı",11,0,1);
P_down1=iCustom(0,0,"Fiyat kanalı",11,1,1);
st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
Özet=iÖzel(0,0,"Özet",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
// tüm verileri ayarla

toplam=SiparişToplam();
if(toplam<1)
{
// Serbest marjı kontrol et
if(AccountFreeMargin()<(1000*Lots))
{
Print("Paramız yok. Serbest Marj = ", AccountFreeMargin());
dönüş(0);
}
// SATIN AL pozisyonu açma koşulu
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
bilet=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Yeşil);

if(bilet>0)
{
if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES))
Alert("Satın Alma: ",OrderOpenPrice());
}
başka Alert("hata:fiyat",OrderOpenPrice());
dönüş(0);
}
int cn=SiparişlerToplam()-1;
for(int i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) devam;
if(OrderOpenTime()>=Time[0]) { // Time[0] - eğer pozisyon mevcut sembolün sıfır çubuğunda açılırsa
bayrak=yanlış;
kırmak;
}
}
cnt=OrdersHistoryTotal()-1;
for(i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) devam et;
if(OrderOpenTime()>=Time[0]) { // Time[0] - eğer pozisyon mevcut sembolün sıfır çubuğunda açılırsa
bayrak=yanlış;
kırmak;
}
}
if(!flag) dönüşü;
// SATIŞ pozisyonu açma koşulu
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
bilet=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
if(bilet>0)
{
if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES))
Alert("Satın Alma: ",OrderOpenPrice());
}
başka Alert("hata:fiyat",OrderOpenPrice());
dönüş(0);
}
int c=SiparişToplam()-1;
for(int a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) devam;
if(OrderOpenTime()>=Time[0]) { // Time[0] - eğer pozisyon mevcut sembolün sıfır çubuğunda açılırsa
bayrak=yanlış;
kırmak;
}
}
cnt=OrdersHistoryTotal()-1;
for(a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) devam et;
if(OrderOpenTime()>=Time[0]) { // Time[0] - eğer pozisyon mevcut sembolün sıfır çubuğunda açılırsa
bayrak=yanlış;
kırmak;
}
}
if(!flag) dönüşü;
dönüş(0);
}
for(cnt=0;cnt<toplam;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SAT &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // uzun pozisyon açık
{
// uzun bir pozisyonu kapatmak için koşul
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
dönüş(0);
}
}
başka
{
// bir kısa pozisyonu kapatmak için koşul
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
dönüş(0);
}
}
}
}
dönüş(0);
}




 
D500_Rised :

Bu mevcutsa, aynı anda 1'den fazla pozisyon nasıl açık olabilir:

total= OrdersTotal ();
if(total<1)

?

Sen yanlış anladın. 1'den fazla pozisyon aynı anda açılmıyor !!!!!!! bir sinyal belirdi - pozisyon açıldı. aynı sıfır çubuğunda fiyat ters yöne gitti ve pozisyonu kapatma koşulu geçerlidir. aynı sıfır çubuğunda buna göre kapanır. Ancak kimse sinyalin eylemini iptal etmedi. ve yeni bir pozisyon açılır ve ters yönde giderken tekrar kapanır.

Öyleyse soru, yeni bir tik ile kapansa bile, tek bir sinyalden sadece bir pozisyonun nasıl açılacağıdır!!??

 
O zaman bar içi ticareti yasaklamanız gerekiyor, bu anahtar kelimelerle arama yapın, bulacaksınız.
 
Kostay :

Kodunuzu danışmana yapıştırın. ama sonuç aynı.

Cad'yi yanlış takmış olmalıyım. Bak lütfen.

Lütfen, yalnızca bir dahaki sefere kodu düğmeye yapıştırın

Hata olmamalı, ancak kontrol etmedim.

 extern double Lots = 0.1 ;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start () {
   double P_up0 , P_down0 , P_up1 , P_down1 ;
   double st_m1 , st_s1 , st_m2 , st_s2 , Pivot , ma_s1 ;
   int i , cnt , ticket , total ;
   bool flag = true ;

   if ( Bars < 100 ) {
       Print ( " bars less than 100 " ) ;
       return ( 0 ) ; 
   }
// Проверяем стоит ли открываться
   
   cnt = OrdersHistoryTotal () - 1 ;
   for ( i = cnt ; i >= 0 ; i -- ) {
       if ( ! OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY )) continue ;
       if ( OrderOpenTime () >= Time [ 0 ]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag = false ;
         break ;
       }
   }
   cnt = OrdersTotal () - 1 ;
   for ( i = cnt ; i >= 0 ; i -- ) {
       if ( ! OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) continue ;
       if ( OrderOpenTime () >= Time [ 0 ]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag = false ;
         break ;
       }
   }
   if ( ! flag ) return ( 0 ) ; 
//-----------------------------------------------
   P_up0 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 0 , 0 ) ;
   P_down0 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 1 , 0 ) ;
   P_up1 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 0 , 1 ) ;
   P_down1 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 1 , 1 ) ;
   st_m1 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 ) ;
   st_s1 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 1 ) ;
   st_m2 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 2 ) ;
   st_s2 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 2 ) ;
   Pivot = iCustom ( 0 , 0 , " Pivot " , 0 , 1 ) ;
   ma_s1 = iMA ( 0 , 0 , 4 , 0 , MODE_SMA , PRICE_CLOSE , 1 ) ;
//задали все данные 

// Проверка свободной маржи
   if ( AccountFreeMargin () < ( 1000 * Lots )) {
       Print ( " We have no money. Free Margin = " , AccountFreeMargin ()) ;
       return ( 0 ) ; 
   }
      
// Условие открытие позиции BUY
   if ( st_m2 > st_s2 && st_m1 > st_s1 && st_m2 < 25 && Pivot < ma_s1 ) {
       ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , 3 , 0 , 0 , "" , 0 , 0 , Green ) ;
       if ( ticket > 0 ) {
         if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ))
             Alert ( " Покупка: " , OrderOpenPrice ()) ; 
       }    else Alert ( " ошибка:по цене " , OrderOpenPrice ()) ; 
       return ( 0 ) ; 
   }
      
// Условие открытие позиции SELL
   if ( st_m2 < st_s2 && st_m1 < st_s1 && st_m2 > 75 && Pivot > ma_s1 ) {
       ticket = OrderSend ( Symbol () , OP_SELL , Lots , Bid , 3 , 0 , 0 , "" , 0 , 0 , Red ) ;
       if ( ticket > 0 ) {
         if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ))
             Alert ( " Покупка: " , OrderOpenPrice ()) ; 
       }    else Alert ( " ошибка:по цене " , OrderOpenPrice ()) ; 
       return ( 0 ) ; 
   }
  
   for ( i = cnt ; i >= 0 ; i -- ) {
       OrderSelect ( cnt , SELECT_BY_POS , MODE_TRADES ) ;
       if ( OrderType () <= OP_SELL && OrderSymbol () == Symbol ()) {
         if ( OrderType () == OP_BUY ) { // длинная позиция открыта
// условие закрытие длинной позиции
             if ( P_down1 > P_down0 ) {
               OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Violet ) ; 
               return ( 0 ) ; 
             }
         }    else {
// условие закрытия короткой позиции
               if ( P_up1 < P_up0 ) {
                   OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Violet ) ; 
                   return ( 0 ) ; 
               }
             }
       }
   }
   return ( 0 ) ;
}
 

Şu anda danışmanla garip bir şey oluyor. pozisyonların taahhütlü kapanışı çalışmıyor. Aynı türden birkaç pozisyon açık olabilir ve aynı anda çalışabilir. Ve sonuç: değiştirilmiş bir versiyonda olsa da her şey aynı problem üzerinde birleşiyor!!??