[ARŞİV!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 4. - sayfa 509

 
Roman. :

Zaten başka bir başlıkta da sormuştu. Cevaplandı ... Ama kodu anlamıyor - kendisi hakkında yazdı.

Bir senaryoya ihtiyacı var (hazır çözüm - tuşa bastı (komut dosyasını başlattı) - ekrana baktı).



Geriye kalan tek şey, onu hesaplarımıza yatırım yapmaya davet etmek! :))

 
borilunad :


Geriye kalan tek şey, onu hesaplarımıza yatırım yapmaya davet etmek! :))


İyi fikir ama uygulaması zor
 

 

saat :

Che ve ben zaten tamamen kafamız karıştı. İşte her biri belirli bir hindi için kendi özel sinyalini alan 3 fonksiyon.

Bu fonksiyon tüm hindilerden ortak bir sinyal alır ve AL veya SATIŞ kararı verir.

Ve bu, genel sinyalin elde edildiği ana fonksiyondur, burada hindilerin değerlerini tüm çubuklardan geçmek için bir döngüden alıyoruz. işlevde:

int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, çift& i_maSlow2)

int GetStochSignal(double&stochD1, double&stochD2, double&stochK1, double&stochK2)

void GetMomentumSignal() , prensipte onu oraya da itebilirsiniz.

Böylece, hindilerin tüm hesaplamalarının bir sinyal alma ana işlevinde olacağı ortaya çıkıyor. Burada her şey mantıklı.

TarasBY :

Victor! Mantığınız var ama bilginiz hala yeterli değil. Birincisi, eğer bu işten vazgeçmezseniz, ders kitabının ötesine geçmenize yardımcı olacaktır, ancak ikincisini "kazanmak" için, şimdilik ondan (ders kitabından) başlamalısınız. SİZİN mantıksal kod yapınızı oluşturmaya (henüz) hazır değilsiniz, alfabetik sürüme geri dönün.
PS Kodunuzda "çarpıcı" olan nedir:

GetSignal() işlevinde, iki satırın kesişimini bulmak için bir for döngüsü KULLANILABİLİR, FAKAT bir while döngüsü DAHA İYİDİR, ancak bu kişisel tercihtir. Ve yeni başlayanlar için, kodun seslendirdiğiniz şeyi yürütmesi için, "Yürüt, affedemezsiniz" bölümünde olduğu gibi parantezleri hareket ettirmeniz gerekir. Bazı nedenlerden dolayı, bu (sonuç olarak ortaya çıkan) işlev iki işlevin sonuçlarını içermiyor: GetStochSignal() ve GetMomentumSignal() - bu KÜÇÜK bir mantık dışıdır.

GetCrossingMa() ve GetStochSignal() işlevlerinde, parametreleri referansa göre geçirmenin HİÇBİR noktası yoktur, çünkü işlev içindeki bu değişkenlerin değerlerini DEĞİŞTİRMELERİ mantıklı olacaktır.

void GetMomentumSignal() işlevi HİÇBİR ŞEY döndürür.

Her ne kadar yandan "görmek daha kötü" olduğunu kabul etsem de ... :)))

MAC (ki) ek'ten sinyal alan işlevin alternatif bir versiyonu:

 //IIIIIIIIIIIIIIIIIII==================CONSTANS=================IIIIIIIIIIIIIIIIIIIIII+
#define       BULL           0
#define       BEAR           1
#define       STOP         - 1
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern int     Use_ChangeTrend.MA      = 0 ;           // 0 - off; Брать сигнал на смене тренда: 
//1 - ТОЛЬКО на первом; 2 - ТОЛЬКО не на первом; 3 - на всех
extern double MA_K_Period             = 3.0 ;         // коэффициент получения периода 2-ой МАшки.
extern int     MA_Period               = 14 ;
/*extern*/ int     MA_Shift                = 0 ;
extern int     MA_Method               = 7 ;
extern int     MA_Price                = 7 ;
/*extern*/ int     Color_Mode               = 0 ;
int            bia_PeriodMA[ 2 ];
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Получаем сигнал по наклону MA или по пересечению 2-х MA                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_SignalMA ( string fs_Symbol,                         // Symbol
                   int fi_TF,                               // Таймфрейм
                   double fd_Deviation = 0 ,                 // расхождение м/у МАшками
                   bool fb_ControlBeginChangeTrend = False, // Контроль начала смены тренда
                   int fi_BarSignal = 1 ,                     // Бар на котором считываем сигнал
                   int fi_VerificationBars = 1 )             // Количество баров для подтверждения сигнала
{
     static int li_preSignal = STOP;
     double lda_MA[ 2 ];
     bool    lb_twice = (MA_K_Period > 1.0 ), lb_Condition;
     int     li_BAR = fi_BarSignal, li_Trend = STOP, li_VerificationBars = 0 , li_cmd = 1 ;
//----
     //---- Если работаем с 2-мя МАшками
     if (lb_twice)
    {
         for ( int li_IND = 0 ; li_IND < 2 ; li_IND++)
        {lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51" , fi_TF, bia_PeriodMA[li_IND], MA_Shift, MA_Method, MA_Price, Color_Mode, 0 , li_BAR);}
         //---- На 1-ом проверяемом баре фиксируем расхождение МАшек
         double ld_Deviation = fControl_Deviation (lda_MA, lb_Condition, li_cmd, li_Trend, fd_Deviation);
    }
     //---- Если работаем с 1-ой МАшкой
     else
    {
         for (li_IND = 0 ; li_IND < 2 ; li_IND++)
        {lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51" , fi_TF, MA_Period, MA_Shift, MA_Method, MA_Price, Color_Mode, 0 , li_BAR + li_IND);}
         double ld_Price = fGet_PriceOnBar ( PRICE_TYPICAL , fs_Symbol, fi_TF, li_BAR);
         //---- На 1-ом проверяемом баре фиксируем расхождение МАшек
        ld_Deviation = fControl_Deviation (lda_MA, lb_Condition, li_cmd, li_Trend, fd_Deviation);
         if (NDD (li_cmd * (lda_MA[ 0 ] - ld_Price)) >= 0.0 ) return (STOP);
    }
     //---- Если фиксируем на баре пересечение или горизонтальное расположение МА - выходим
     if (ld_Deviation == 0.0 ) return (STOP);
     int li_cnt = 0 ;
     while (lb_Condition == true)
    {
        li_BAR++;
         //---- Собираем показания МАшек в массив
         if (lb_twice)
        {
             for (li_IND = 0 ; li_IND < 2 ; li_IND++)
            {lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51" , fi_TF, bia_PeriodMA[li_IND], MA_Shift, MA_Method, MA_Price, Color_Mode, 0 , li_BAR);}
             bool lb_AddCondition = true;
            li_cnt++;
        }
         else
        {
             for (li_IND = 0 ; li_IND < 2 ; li_IND++)
            {lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51" , fi_TF, MA_Period, MA_Shift, MA_Method, MA_Price, Color_Mode, 0 , li_BAR + li_IND);}
            ld_Price = fGet_PriceOnBar ( PRICE_TYPICAL , fs_Symbol, fi_TF, li_BAR);
            lb_AddCondition = (NDD (li_cmd * (lda_MA[ 0 ] - ld_Price)) < 0.0 );
        }
         //---- Фиксируем расхождение МАшек или наклон 1-ой МА
        ld_Deviation = NDD (lda_MA[ 0 ] - lda_MA[ 1 ]);
         //---- Определяем условия контроля пересечения МАшек или изменение наклона
         if (li_Trend == BULL) lb_Condition = (ld_Deviation >= 0.0 ); else lb_Condition = (ld_Deviation <= 0.0 );
         //---- Производим подсчёт баров, на которых выполняется означенное расхождение
         if (lb_AddCondition)
        {
             if (fd_Deviation != 0.0 ) { if ( MathAbs (ld_Deviation) >= fd_Deviation) li_VerificationBars++;}
             else li_VerificationBars++;
        }
         else li_cnt++;
         //---- Если не отслеживаем начало смены тренда
         if (!fb_ControlBeginChangeTrend) { if (li_VerificationBars == fi_VerificationBars) return (li_Trend);}
         else
        {
             //---- Если баров, на которых выполняются заданные нами условия, > fi_VerificationBars - выходим
             if (li_VerificationBars > fi_VerificationBars) {li_preSignal = STOP; return (STOP);}
             else if (!lb_Condition)
            {
                 if (li_VerificationBars == fi_VerificationBars) { return (li_Trend);}
                 //---- Если не набрали нужное количество подтверждений сиганала после пересечения
                // или смены наклона - выходим
                 else if (li_VerificationBars < fi_VerificationBars) return (STOP);
            }
        }
         //---- Предусматриваем уход от зацикливания (на начале отсчёта)
         if (li_cnt > MA_Period) return (STOP);
    }
//----
     return (STOP);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Контролируем расхождение 2-ух МАшек или наклон 1-ой МАшки                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fControl_Deviation ( double ar_MA[],           // массив входящих значений
                           bool & fb_Condition,       // состояние тренда
                           int & fi_cmd,               // "знак тренда"
                           int & fi_Trend,             // тренд
                           double fd_Deviation = 0 )   // расхождение м\у МАшками
{
     double ld_Deviation = NDD (ar_MA[ 0 ] - ar_MA[ 1 ]);
//----
     //---- Если фиксируем на баре пересечение или горизонтальное расположение МА - выходим
     if (ld_Deviation == 0.0 ) return ( 0.0 );
     //---- Проверяем расхождение на нужную величину (если задано)
     if (fd_Deviation != 0.0 ) { if ( MathAbs (ld_Deviation) < fd_Deviation) return ( 0.0 );}
     if (ld_Deviation > 0.0 ) {fb_Condition = (ld_Deviation >= 0.0 ); fi_Trend = BULL;}
     else {fb_Condition = (ld_Deviation <= 0.0 ); fi_Trend = BEAR; fi_cmd = - 1 ;}
//----
     return (ld_Deviation);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Yorumlardan da anlaşılacağı gibi, sinyal bir MA'nın eğimi (MA_K_Period <= 1.0 olduğunda) veya 2 MA'nın kesişimi (MA_K_Period > 1.0 olduğunda) ile elde edilebilir. 2. Mashka'nın periyodu bağımsız olarak hesaplanır (bu fonksiyonun dışında):

    bia_PeriodMA[ 0 ] = MA_Period;
    bia_PeriodMA[ 1 ] = MA_Period * MA_K_Period;

Fonksiyonda ayrıca 2 Mashka'nın diverjansı için bir koşul ayarlayabilirsiniz (fd_Deviation > 0.0 için). Ayrıca kesişimin durumunu da takip edebilir (fb_ControlBeginChangeTrend = TRUE) veya sadece Hızlı ve Yavaş'ın konumunu birbirine göre sabitleyebilirsiniz.

Bu kodun nasıl çalıştığını görmek için arşive bu fonksiyonun sinyallerine göre oklar çizen bir gösterge koydum. Signal_MA.tpl şablonu (bir MA için) veya Signal_MA2.tpl (2 için) aracılığıyla başlatıyoruz. Bu arada, Mashki farklı şekilde alınabilir.

Dosyalar:
signal_ma.zip  185 kb
 
TarasBY :

MAC (ki) ek'ten sinyal alan işlevin alternatif bir versiyonu:

Yorumlardan da anlaşılacağı gibi, sinyal bir MA'nın eğimi (MA_K_Period <= 1.0 olduğunda) veya 2 MA'nın kesişimi (MA_K_Period > 1.0 olduğunda) ile elde edilebilir. 2. Mashka'nın periyodu bağımsız olarak hesaplanır (bu fonksiyonun dışında):

Fonksiyonda ayrıca 2 Mashka'nın diverjansı için bir koşul ayarlayabilirsiniz (fd_Deviation > 0.0 için). Ayrıca kesişimin durumunu da takip edebilir (fb_ControlBeginChangeTrend = TRUE) veya sadece Hızlı ve Yavaş'ın konumunu birbirine göre sabitleyebilirsiniz.

Bu kodun nasıl çalıştığını görmek için arşive bu fonksiyonun sinyallerine göre oklar çizen bir gösterge koydum. Bu arada, Mashki farklı şekilde alınabilir.


Göstergeyi hızlandırmak istiyorsanız, lütfen iletişime geçin.
 
Vinin :

Göstergeyi hızlandırmak istiyorsanız, lütfen iletişime geçin.
Bir gösterge ise, o zaman ne? - hangi Mashki sayılır? Her durumda, ilginç olacak!
 

Güzel gün! Sipariş değişikliği - hata 4051. Bunu bir saattir düşünüyorum. Görünüşe göre parametre orada doğru !!! Kısacası, kelimenin tam anlamıyla. fiyat parametresi, varsayılan olarak sipariş açılış fiyatı olan OrderOpenPrice ()'dir.

Stop emrinin açılış fiyatının 10 puan altına taşıyoruz ve fiyat geri itildi. Bir sipariş açılırken tsena değişkeninde hatırlanır.

Biri kârlı, diğeri kârsız olmak üzere iki emir var. Burada, açık görünüyor. Hata nereden? Onun için başka ne var?

Evet, artık alakalı olmasa da durum açık görünüyor. Yani fiyat 30 puan gitti - koşul çalıştı. ( tsena+ 30 * Puan ).

Bir kez giyin perenos=true; Bu koşullar aslında işe yarıyor gibi görünüyor.

Kendimi nasıl düşüneceğimi bilmiyorum.

Aslında bir kez giyin perenos=true; Bu koşullara uyulmasına gerek yoktu, çünkü hiçbir yerde giymez.


 bool napravlenieCCI=false;
 if ( CCI_50S< 100 &&CCI_50> 100 ||CCI_50S< 0 &&CCI_50> 0 || CCI_50S<- 100 &&CCI_50>- 100   )napravlenieCCI=true; // if( CCI_50S>CCI_50&& )napravlenieCCI=false;
 
 bool wishseLMA=false; //Свеча закрывается или находится выше LMA
 if (Bid>LMA_100) wishseLMA=true; Print ( "до условияsrabotka    " ,srabotka ); Alert ( "до условияsrabotka    " ,srabotka );
 
 if (EMA_20S>EMA_10S&&EMA_20<EMA_10&&napravlenieCCI&&wishseLMA&&!srabotka) { /// нашли пирисечение сверху вниз и направление CCI вверх
 RefreshRates ();
           int tacket= OrderSend ( Symbol ( ), OP_BUY, lot, NormalizeDouble (Ask, Digits ), 5 , NormalizeDouble ( Ask- ( 35 * Point ), Digits ), 
           NormalizeDouble ( Ask+( 45 * Point ), Digits ), NULL , 450 , 0 , CLR_NONE );
           int Error= GetLastError (); if (Error== 0 ){  
           Sleep ( 2000 ); RefreshRates (); double profit = NormalizeDouble ( Ask+( 45 * Point ), Digits ); tsena=Ask; perenos = false;
           int tucket= OrderSend ( Symbol ( ), OP_BUY, lot, NormalizeDouble (Ask, Digits ), 5 , NormalizeDouble ( Ask- ( 35 * Point ), Digits ),
           0 , NULL , 450 , 0 , CLR_NONE ); 
           if (Error== 0 )   
           srabotka= true; }}
           
           if (Error!= 0 ){ string errorcomment = "Ошибка открытия  ордера OP_BUY"   + " " + Symbol () +   " " + ErrorDescript(Error); 
             Print (errorcomment);}
 
 
 if (tsena+ 30 * Point <Ask&&!perenos){ 
 OrderModify (  tacket, OrderOpenPrice (), tsena- 10 * Point , OrderTakeProfit (), 0 , CLR_NONE );
 Error= GetLastError (); if (Error== 0 ){  
 OrderModify (  tucket, OrderOpenPrice (), tsena- 10 * Point , OrderTakeProfit (), 0 , CLR_NONE );
 Error= GetLastError (); if (Error== 0 ){  
 perenos=true;}}} 
 
 if (Error!= 0 ){  errorcomment = "Ошибка модификайции ордера OP_BUY"   + " " + Symbol () +   " " + ErrorDescript(Error); 
             Print (errorcomment);BreakPoint();} 
 

Aslında başka bir önemli parametre bileti var. Ancak, bunu int tacket=OrderSend gibi bir değişkene atadım ve int tucket=OrderSend gibi,

ve buna göre kullanıyorum OrderModify( tacket ve kısacası resmi olarak orada herhangi bir hata görmüyorum !!!

 

Lanet olsun... 2012.11.14 22:40:17 2012.08.16 15:30 vasilyprr EURGBP,M30: 1Hata 0 tacket 5 yani sipariş açıldı, bilet tahsis edildi.

Ve biraz daha ötede zaten sıfıra eşit! Yani, kodun değiştirilen sonraki bölümünün içinde.

2012.11.14 23:05:27 2012.08.17 11:03 vasilyprr EURGBP,M30: tacket 0 OrderOpenPrice() 0.7845 tsena-10*Point 0.7835 OrderTakeProfit() 0.789

Yukarıda belirtilen kod bölümünün dışında, değişken hiç oynamaz!

Ukrayna düzenini herhangi bir tuş kombinasyonuyla değiştiremiyorum, ancak Rusça olanı yazılıyor!

 
Dimka-novitsek :

Aslında başka bir önemli parametre bileti var. Ancak, bunu int tacket=OrderSend gibi bir değişkene atadım ve int tucket=OrderSend gibi,

ve buna göre kullanıyorum OrderModify( tacket ve kısacası resmi olarak orada herhangi bir hata görmüyorum !!!


Görünüşe göre DC, SL ve TP ile hemen kabul etmiyor. Açtıktan sonra ST ve TP'yi değiştirin. Ve 2. pozisyon bir sonraki tik ile hemen açılmamalıdır!
 
Evet teşekkür ederim. Ama bir kayma var ve genel olarak açılıyor. Ayrı ayrı değiştirmeye çalışacağım, dur, ama sadece bir durak mı taşıyorum?