[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 842

 
sipariş değişikliğiniz açılışla aynı blokta ve durumu emir yok. Az önce bir sipariş açtığınız ve hemen değiştirmeye çalıştığınız ortaya çıktı - peki 5 puanlık kâr nereden geliyor?
 

Merhaba! Son zamanlarda hareketli ortalamalarla ilgilenmeye başladım. Ticaret için belirli bir hareket ve koşul kombinasyonu buldum, TS'mi, karlı olup olmadığını kontrol etmeye karar verdim, eğer varsa, optimize edin. Ancak test sırasında yazdığım danışman işlem açmıyor. Bütün akşam işkence gördüm ve bir çözüm bulamayınca size sormaya karar verdim sevgili programcılar. Danışmanın nasıl çalıştığını anlamak için, TS'mi kısaca açıklayacağım: EMA(13) ve EMA(55) çizelgelerinde, eğer çubuk EMA(13)'ü geçtiyse ve sonraki tüm çubuklar EMA(13)'ün üstünde/altındaysa, daha sonra fiyat MA'ya (13) dokunduğunda, önceki çubukların bulunduğu yönde bir pozisyon açın (geçtikten sonra + 9'dan az ve 23'ten fazla değil). 60 pip kâr edin, zararı durdur = EMA(55) artı veya eksi beş pip. Aslında tüm strateji bu. Daha açık hale getirmek için bir örnek gönderdim:

Ve işte danışman kodu:

 //+------------------------------------------------------------------+
//|                                                          DWM.mq4 |
//|                                 Copyright © 2010, Bobkov Vasiliy |
//|                                          http://www.forex4you.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Bobkov Vasiliy"
#property link      "http://mql4.com"
extern double Lot= 0.1 ;
extern int FastMA= 13 ;         //Быстрая МА
extern int SlowMA= 54 ;         //МедленнаяМА
extern int TP= 60 ;             //Тейк профит
extern int MinBars= 8 ;         //Минимальное кол-во баров вне МА
extern int MaxBars= 25 ;        //Максимальное кол-во баров вне МА
extern int slippage= 3 ;        //Слипадж
extern int Magic= 347586 ;      //Магическое число
extern int Space= 10 ;          //Отступ от МА при тралле ордеров

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if (OrderCheck()==true)                                        //Проверяем, есть ли ордер...
   {                                                           //...если ордер есть...
   Trall();                                                    //Траллим
   return ( 0 );
   }
else                                                           //...если нет открытых позиций то...
   {
   double FMA=MA( 0 );
   double SMA= iMA ( NULL , 0 ,SlowMA, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   for ( int x= 1 ;;x++)                                          //Вычесляем сколько баров вне МА...
      {
      if (MA(x)<High[x]&& MA(x)>Low[x]) break ;
      }
   if (Bid==FMA && x>MinBars && x<MaxBars)                     //Если условия выполняются, то...
      {
      if (FMA>SMA ) OrdOpen( 0 ,SMA);                            //...открывем сделку на покупку
      if (FMA<SMA) OrdOpen( 1 ,SMA);                             //...или на продажу
      }
   }   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+

bool OrderCheck()                                              //Функция проверки позиций
   {
   for ( int i= 1 ;i<= OrdersTotal ();i++)
      {
      if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
         {
         if (OrderSymbol()== Symbol () && OrderMagicNumber()==Magic) return (true);
         }
      else
         Print ( "OrderSelect() вернул ошибку - " , GetLastError ());
          
      }
    return (false);
   }

void OrdOpen( int type, double SO)                               //Функция открытия позиций
   {
   if (type== 0 ) 
      {
      if ( OrderSend ( Symbol (), 0 ,Lot,Ask,slippage,SO-Space* Point ,Ask+TP* Point , NULL ,Magic, 0 , Blue )==true) return ;
      else Print ( "OrderSend() вернул ошибку - " , GetLastError ());
      }
   else 
      {
      if ( OrderSend ( Symbol (), 0 ,Lot,Bid,slippage,SO+Space* Point ,Bid-TP* Point , NULL ,Magic, 0 , Blue )==true) return ;
      else Print ( "OrderSend() вернул ошибку - " , GetLastError ());
      }
   return ;
   }
   
void Trall()                                                    //Трейллинг стоп
   {
   if ( OrderSelect (Magic,SELECT_BY_TICKET)==true)
      {
      double SL= iMA ( NULL , 0 ,SlowMA, 0 , MODE_EMA , PRICE_CLOSE , 0 );
      if (Bid< iMA ( NULL , 0 ,SlowMA, 0 , MODE_EMA , PRICE_CLOSE , 0 )) SL=SL+Space* Point ;
      else SL=SL-Space* Point ;
      if (OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble (SL, Digits ),OrderTakeProfit(), 0 , Blue )==true) return ;
      else Print ( "OrderModify() вернул ошибку - " , GetLastError ());
      }
   return ;
   }
double MA( int m)                                                  //Функция возвращающая значение МА
   {
   return ( iMA ( NULL , 0 ,FastMA,m, MODE_EMA , PRICE_CLOSE , 0 ));
   }

Herhangi biri yardım edebilirse lütfen. Danışmanın kendisini de gönderiyorum

Dosyalar:
dwm.mq4  5 kb
 

Bir for-loop, açma, değiştirme, pozisyonları kapatma vb. için birçok işlevi içerebilir.

İşte basit bir örnek:

             bool Ans=OrderModify(Ticket,Price,SL,TP, 0 );
             if (Ans== true ) {
               Alert ( "Ордер " ,Text,Ticket, " модифицирован:)" );
               break ;                           // Из цикла модифи.
            }

- Soru: Burada "return" yerine "break" kullanmak doğru mu? Bir fark var mı?

 
chief2000 :

Bir for-loop, açma, değiştirme, kapama pozisyonları vb. için birçok fonksiyon içerebilir.

İşte basit bir örnek:

- Soru: Burada "break" kullanmak ve "return" kullanmak doğru mu? Bir fark var mı?

https://docs.mql4.com/en/basis/operators/break adresinden :
" break deyimi, en yakın iç içe dış anahtarın yürütülmesini sonlandırır while, or for deyimi. Kontrol, sona eren deyimden sonraki deyime aktarılır."

https://docs.mql4.com/ru/basis/operators/return adresinden :
" Dönüş ifadesi , geçerli işlevin yürütülmesini sonlandırır ve kontrolü çağıran programa geri verir."

Cevap: Burada "break" kullanmak doğrudur.

 
abolk :

https://docs.mql4.com/en/basis/operators/break adresinden :
" break deyimi, en yakın iç içe dış anahtarın yürütülmesini sonlandırır while, or for deyimi. Kontrol, sona eren deyimden sonraki deyime aktarılır."

https://docs.mql4.com/ru/basis/operators/return adresinden :
" Dönüş ifadesi , geçerli işlevin yürütülmesini sonlandırır ve kontrolü çağıran programa geri verir."

Cevap: Burada "break" kullanmak doğrudur.

Genel olarak, kendim break kullanıyorum, ancak dönüşün bir onay değişikliği anlamına geldiğini düşündüm (ve mola değil).

Gerçekte, sıra değişirken, bir onay değişikliği olacaktır ve bu nedenle, test cihazının durumu doğru bir şekilde modellemesi için

dönüş kullanılmalıdır. Doğru?

Belki yanılıyorum ama anlamak isterim.

 
chief2000 :

Genel olarak, kendim break kullanıyorum, ancak dönüşün bir onay değişikliği anlamına geldiğini düşündüm (ve mola değil).

Gerçekte, sıra değişirken, bir onay değişikliği olacaktır ve bu nedenle, test cihazının durumu doğru bir şekilde modellemesi için

dönüş kullanılmalıdır. Doğru?

Belki yanılıyorum ama anlamak isterim.

Belgelerde şunları okuduk: " Dönüş ifadesi , geçerli işlevin yürütülmesini sonlandırır ve kontrolü çağıran programa geri verir."

Geçerli işlev start() ise, belgelerde tekrar okuruz:

https://docs.mql4.com/ru/runtime/start
"Yeni teklifler geldiğinde, eklenen Uzman Danışmanlar ve özel göstergeler için start() işlevi yürütülür. Yeni bir teklif geldiğinde, önceki teklifte başlatılan start() işlevi yürütülürse, gelen teklif yok sayılır Uzman Danışman tarafından.Programın yürütülmesi sırasında alınan tüm yeni alıntılar, start() işlevinin bir sonraki yürütmesi tamamlanana kadar program tarafından yok sayılır.Bundan sonra, start() işlevi, yalnızca programın gelmesinden sonra başlatılacaktır. sonraki yeni alıntı."

 
abolk :

Belgelerde şunları okuduk: " Dönüş ifadesi , geçerli işlevin yürütülmesini sonlandırır ve kontrolü çağıran programa geri verir."

Geçerli işlev start() ise, belgelerde tekrar okuruz:

https://docs.mql4.com/ru/runtime/start
"Yeni teklifler geldiğinde, eklenen Uzman Danışmanlar ve özel göstergeler için start() işlevi yürütülür. Yeni bir teklif geldiğinde, önceki teklifte başlatılan start() işlevi yürütülürse, gelen teklif yok sayılır Uzman Danışman tarafından.Programın yürütülmesi sırasında alınan tüm yeni alıntılar, start() işlevinin bir sonraki yürütmesi tamamlanana kadar program tarafından yok sayılır.Bundan sonra, start() işlevi, yalnızca programın gelmesinden sonra başlatılacaktır. sonraki yeni alıntı."

Kendi kelimenle yazsaydın daha iyi olurdu.. Ne demek istediğini anlamadım.

Test cihazında, bir for, bir ara ve ardından başka bir işlevle sonlandırılırsa, aynı tıklama ile yürütülür. Ancak gerçek hayatta, bu süre boyunca (sıralama değiştirilirken) birkaç tik değişebilir. Bu yüzden dönüşün daha gerçek davranışı yansıttığını düşünüyorum. Öyle değil mi?

 
chief2000 :

Kendi kelimenle yazsaydın daha iyi olurdu.. Ne demek istediğini anlamadım.

Bir for, bir ara ile sona ererse ve ardından başka bir işlev tarafından takip edilirse, aynı tıklama ile yürütülür. Ancak gerçek hayatta, bu süre boyunca (sıralama değiştirilirken) birkaç tik değişebilir. Bu yüzden dönüşün daha gerçek davranışı yansıttığını düşünüyorum. Öyle değil mi?


start(), tik başlangıcı ile çalışmaya başlar ve işi bir sonraki tik başlangıcında tamamlanmayabilir.

break için biter, return işlevi bitirir. for'dan sonra operatör yoksa, bu algoritma için kullanma ve döndürme arasında hiçbir fark yoktur.

AMA her operatörün amacı vardır. Ve operatörün kötüye kullanılması, boş bir silah gibidir.

Yine for döngüsündeki algoritmaya göre, nedense işlevi yürütmeye devam etmeye gerek yoktur, o zaman geri dönüş kullanabilirsiniz.

Başka bir deyişle, algoritmaya göre döngünün kesilmesi gerekiyorsa, fonksiyon döngüden sonra yine de bitse bile break ayarlanır.

 
abolk :


start(), tik başlangıcı ile çalışmaya başlar ve işi bir sonraki tik başlangıcında tamamlanmayabilir.

break için biter, return işlevi bitirir. for'dan sonra operatör yoksa, bu algoritma için kullanma ve döndürme arasında hiçbir fark yoktur.

AMA her operatörün amacı vardır. Ve operatörün kötüye kullanılması, boş bir silah gibidir.

Yine for döngüsündeki algoritmaya göre, nedense işlevi yürütmeye devam etmeye gerek yoktur, o zaman geri dönüş kullanabilirsiniz.

Başka bir deyişle, algoritmaya göre döngünün kesilmesi gerekiyorsa, fonksiyon döngüden sonra yine de bitse bile break ayarlanır.

Fikir geldi - tüm bunlar yalnızca test cihazı için başlatıldığından, (gerektiğinde) aşağıdakileri yapmak mümkündür:

 if (IsTesting()== true    ||   IsOptimization()== true ) {
   return ;
}

break ;

Teşekkür ederim!

 
chief2000 :

Fikir geldi - tüm bunlar yalnızca test cihazı için başlatıldığından, (gerektiğinde) aşağıdakileri yapmak mümkündür:

Teşekkür ederim!


olabilmek
Neden: