Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 210

 

Tünaydın.

Stratejim yayılma değerini hesaba katıyor, yayılma şu fonksiyon tarafından belirleniyor:

 double Spread_(){
   double spread = 0.0 ;
     RefreshRates();
     spread = MathRound ((Ask - Bid) / Point );
   return (spread);
}   

Ancak strateji test cihazındaki yayılma sabit olduğundan, rastgele bir yayılma emülatörüne ihtiyaç vardı. Test cihazındaki yayılma değişikliklerini taklit etmek için, vakaların %80'inde 2 ila 3 puan (4 hane) aralığında ve %20'sinde 3 puandan fazla. Belki bunun nasıl uygulanacağına dair fikirler vardır veya benzer bir fikrin çözüldüğü bağlantılar vardır.

 
artmedia70 :


Sihirle ilgili bir hata, durarak kapanırken danışmanınızın pozisyonunun durarak kapatıldığını görmemesine neden olur. Niye ya? Cevap: Magic 123 ile pozisyonları açarsınız ve Magic değişkenini stop ile kapatmayı kontrol etme fonksiyonuna gönderirsiniz. Örtük başlatma ile neye eşit olduğunu düşünüyorsunuz? Sıfır. Doğal olarak, fonksiyonda sihirli 0 ile pozisyonlar aranır ve pozisyonlarınız için 123'e eşittir.Ve tartışmıyoruz, ama... özensiz tartışıyoruz... Kapanışları durdurmak için yanıtı kontrol edin:


Danışmanın "ölü" mantığının geri kalanına bakmadım - durarak kapanmayı kontrol etme işleviyle başa çıkmanıza yardımcı oldum ...


Artem! Tünaydın! Yardımın için tekrar teşekkürler.

Tüm gereksiz "ölü" mantığı kaldırdı ve gerisini "canlandırdı" .... anladığım kadarıyla.

Neredeyse sadece düzeltmeme yardım ettiğin işlevi bıraktım.

Ama mucizeler kavrayışımın ötesinde olmaya başladı.

1. Danışmanınızın her mumun başında fırsatlar açtığı formda (5 dakikam var)

belirtilen tüm koşulları göz ardı ederken

Onlar. kontrol ilk satıra gider

double Fiyat=iOpen(Symbol(),0,0);

ve sonra neden 11 çizgiyi atlayıp çizgilere çarpıyor?

parti = 0.1;

OrderSend (Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );

2. Minimum lotu hesaplayan satırı kaldırırsak Lot=MarketInfo(Symbol(), MODE_MINLOT);

EA iyi çalışıyor, ancak isCloseLastPosByStop işlevi çalışmıyor.

Çok uzun süre kıvrımlarımı zorladım ..... ama boşuna. Hatanın nerede saklandığını söylerseniz size minnettar olurum.

 double    Lot = 0.1 ;                                          //я проинициализировал переменную
int       Magic= 123 ;

int start() 
{

   double Price=iOpen( Symbol (), 0 , 0 );                       //запоминаем время открытия очередной свечи
   int ot= OrdersTotal ();                                   //запоминаем количество всех открытых ордеров
       if ((ot== 0 )                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     // И ПРИ ЭТОМ   если  цена = цене открытия очередной свечи
         &&(Open[ 1 ]-Close[ 1 ]> 100 * Point &&Open[ 1 ]-Close[ 1 ]< 120 * Point )      // И ПРИ ЭТОМ   если свеча N1 соответствуе этим параметрам
            &&(High[ 1 ]-Open[ 1 ]> 40 * Point &&High[ 1 ]-Open[ 1 ]< 60 * Point )       // И ПРИ ЭТОМ   если свеча N1 соответствуе этим параметрам
                &&(Close[ 1 ]-Low[ 1 ]> 40 * Point &&Close[ 1 ]-Low[ 1 ]< 60 * Point ))  // И ПРИ ЭТОМ   если свеча N1 соответствуе этим параметрам
                
                   Lot=MarketInfo( Symbol (), MODE_MINLOT);                   //вычислить минимальный лот инструмента
                               
                   if (isCloseLastPosByStop( Symbol (), OP_BUY, Magic, Lot)) //вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                                                   //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     t=Lot* 2 ; // удваиваем начальный лот
                     OrderSend ( Symbol (),OP_SELL,Lot,Bid, 1 ,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );
                     }
                   else                                                     //в противном случае(если функция на вернула ??????
                     {
                     Lot= 0.1 ;                                             // лот отстается 0.1       
                     OrderSend ( Symbol (),OP_SELL, 1 ,Bid,Lot,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );
                     }
                      
   return ( 0 );
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop( string sy, int op, int mn, double &ll) {
   double    pt;
   int       dg, i, j=- 1 , k=OrdersHistoryTotal()- 1 ;
   datetime t= 0 ;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>= 0 ; i--) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue ;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)         continue ;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)           continue ;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if ( OrderSelect (j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);       // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
       if ( MathAbs (OrderClosePrice()-OrderStopLoss())< 0.5 *pt) { // Если закрыт по стопу
         ll=OrderLots();                               // записываем количество лотов в ордере, закрытом по стопу
         return ( true );                                 // возвращаем истину
         }
      }
   return (False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}


 

güneş600 :

Артем ! Добрый день! Еще раз спасибо за помощь.

Tüm "ölü mantığını" kaldırdı ve gerisini kendi anlayışına göre "canlandırdı".

Neredeyse sadece düzeltmeme yardım ettiğin işlevi bıraktım.

Ama mucizeler kavrayışımın ötesinde olmaya başladı.

Sonrasında

 if ((ot== 0 )                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[ 1 ]-Close[ 1 ]> 100 * Point &&Open[ 1 ]-Close[ 1 ]< 120 * Point ) //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[ 1 ]-Open[ 1 ]> 40 * Point &&High[ 1 ]-Open[ 1 ]< 60 * Point )
               &&(Close[ 1 ]-Low[ 1 ]> 40 * Point &&Close[ 1 ]-Low[ 1 ]< 60 * Point ))

her şeyi gövdeye ekle { }

Artem olmadığım için üzgünüm.

 
ALXIMIKS :

güneş600 :

Sonrasında

her şeyi gövdeye ekle { }

Artem olmadığım için üzgünüm.

Teşekkür ederim İlk defa affediyorum ....... (Eğlenceli bir ifade nasıl ekleyeceğimi bilmiyorum)
 
 t=Lot* 2 ; // удваиваем начальный лот
                     OrderSend ( Symbol (),OP_SELL,Lot,Bid, 1 ,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );

yani t veya hepsi aynı Lot ???

 
ALXIMIKS :

güneş600 :

Sonrasında

her şeyi gövdeye ekle { }

Artem olmadığım için üzgünüm.

Dediğiniz gibi yaptım ..... ne yazık ki danışman çalışıyor .... isCloseLastPosByStop işlevi çalışmıyor

 double    Lot= 0.1 ;
int       Magic= 123 ;

int start() 
{

   double Price=iOpen( Symbol (), 0 , 0 );   //запоминаем время открытия очередной свечи
   int ot= OrdersTotal ();               //запоминаем количество всех открытых ордеров
       if ((ot== 0 )                       //если ордеров в рынке никаких нет
      &&(Bid==Price)                   //И ПРИ ЭТОМ  если ПРИ ЭТОМ  цена = цене открытия очередной свечи
         &&(Open[ 1 ]-Close[ 1 ]> 100 * Point &&Open[ 1 ]-Close[ 1 ]< 120 * Point ) //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[ 1 ]-Open[ 1 ]> 40 * Point &&High[ 1 ]-Open[ 1 ]< 60 * Point )
               &&(Close[ 1 ]-Low[ 1 ]> 40 * Point &&Close[ 1 ]-Low[ 1 ]< 60 * Point ))
               
                 {
                  Lot=MarketInfo( Symbol (), MODE_MINLOT);             //вычислить минимальный лот инструмента
                               
                   if (isCloseLastPosByStop( Symbol (), OP_BUY, Magic, Lot)) //вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                             //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     Lot=Lot* 2 ; // удваиваем начальный лот
                     OrderSend ( Symbol (),OP_SELL,Lot,Bid, 1 ,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );
                     }
                   else    //в противном случае(если функция на вернула??????
                     {
                     Lot= 0.1 ; // лот отстается 0.1       
                     OrderSend ( Symbol (),OP_SELL, 1 ,Bid,Lot,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );
                     }
                      } 
   return ( 0 );
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop( string sy, int op, int mn, double &ll) {
   double    pt;
   int       dg, i, j=- 1 , k=OrdersHistoryTotal()- 1 ;
   datetime t= 0 ;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>= 0 ; i--) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue ;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)         continue ;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)           continue ;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if ( OrderSelect (j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);       // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
       if ( MathAbs (OrderClosePrice()-OrderStopLoss())< 0.5 *pt) { // Если закрыт по стопу
         ll=OrderLots();                               // записываем количество лотов в ордере, закрытом по стопу
         return ( true );                                 // возвращаем истину
         }
      }
   return (False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
 

İşte bool isCloseLastPosByStop( string sy, int op, int mn, double &ll) işlevinden bir kod parçası

Ve kayma 3 pip ise? Bir şekilde düşünülmedi))

 if ( MathAbs (OrderClosePrice()-OrderStopLoss())< 0.5 *pt) { // Если закрыт по стопу
         ll=OrderLots();                               // записываем количество лотов в ордере, закрытом по стопу
         return ( true );                                 // возвращаем истину
 
solnce600 :

Anlıyorsunuz - henüz bununla uğraşmıyorum ....

Bütün bir hafta boyunca bu fonksiyonun neden ihtiyacım olduğu için çalışmadığını anlayamıyorum.

Yani, stoptan sonra, stop tarafından kapatılan emrin hacminin iki katı olan bir sonraki emrin açılmasına ihtiyacım var ve durmadan sonra, bir sonraki emir normal hacimle açılıyor.


İşin mantığını düzeltin yoksa düşünmek uzun sürer
 
ALXIMIKS :

İşte bool isCloseLastPosByStop( string sy, int op, int mn, double &ll) işlevinden bir kod parçası

Ve kayma 3 pip ise? Bir şekilde düşünülmedi))


Anlıyorsunuz - henüz bununla uğraşmıyorum ....

Bütün bir hafta boyunca bu fonksiyonun neden ihtiyacım olduğu için çalışmadığını anlayamıyorum.

Yani, stoptan sonra, stop tarafından kapatılan emrin hacminin iki katı ile bir sonraki emrin açılmasına ihtiyacım var ve durmadan sonra, bir sonraki emir normal hacimle açılıyor.
 

Ve neden siparişlerin geçmişine dokunalım ? dengeye bakın - o yönde nereye gittiniz ve lotu değiştirdiniz.

Keşke bir robot internette ticaret yapacaksa.