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.
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?
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); // возвращаем ложь (позиции нету, либо не по стопу)
}
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 ))
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 boolisCloseLastPosByStop(stringsy,intop,intmn,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 ); // возвращаем истину
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.
İşte boolisCloseLastPosByStop(stringsy,intop,intmn,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.
Tünaydın.
Stratejim yayılma değerini hesaba katıyor, yayılma şu fonksiyon tarafından belirleniyor:
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.
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.
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
her şeyi gövdeye ekle { }
Artem olmadığım için üzgünüm.
güneş600 :
Sonrasında
her şeyi gövdeye ekle { }
Artem olmadığım için üzgünüm.
yani t veya hepsi aynı Lot ???
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
İş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ı 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
İş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.