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

 
paladin80 :
Deneyimlerime göre, hataları bulmanın en etkili yolu, yorumlardaki mesajları hata numarasıyla birlikte görüntülemek ve ardından EA'nın görsel bir çalışmasını izlemektir. Başlangıçta çok zaman alır, ancak daha sonra bunu hatasız nasıl yapacağınızı çabucak öğrenirsiniz. Ayrıca, /* ... */ kullanarak kodun bölümlerini hariç tutarak, danışmanın davranışının nasıl değişeceğini belirleyebilirsiniz.
bende aynısını yapıyorum))
 
alsu :
Doğru anladın. Ayrıca, değeri kutudan çıkardığımızda, double türündedir, ancak sonucu int türünde bir değişkene yazma komutu verilirse, derleyici değeri bir değişkene koymak için gerekli tüm işlemleri otomatik olarak yapacaktır. yeni kutu.


Sonunda her şeyi doğru anladığımdan emin olmak için lütfen son paragrafınızla ilgili düşüncelerimi kontrol edin ... O halde yukarıda bahsedilen uzmanı alalım:

 //--------------------------------------------------------------------
// globalvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int     Experts;                                 // Колич. экспертов
double Depo= 10000.0 ,                             // Заданный депозит
       Persent= 30 ,                               // Заданный процент     
       Money;                                   // Искомые средства
string Quantity= "GV_Quantity" ;                   // Имя GV-переменной
//--------------------------------------------------------------------
int init()                                       // Спец. функция init
  {
   Experts= GlobalVariableGet (Quantity);         // Получим тек. знач.
   Experts=Experts+ 1 ;                           // Колич. экспертов
   GlobalVariableSet (Quantity, Experts);         // Новое значение
   Money=Depo*Persent/ 100 /Experts;               // Средства для эксп.
   Alert ( "Для эксперта в окне " , Symbol (), " выделено " ,Money);
   return ;                                       // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int New_Experts= GlobalVariableGet (Quantity); // Новое колич. эксп.
   if (Experts!=New_Experts)                     // Если изменилось
     {
      Experts=New_Experts;                       // Теперь текущ. такое
      Money=Depo*Persent/ 100 /Experts;           // Новое знач. средств 
       Alert ( "Новое значение для эксперта " , Symbol (), ": " ,Money);
     }
   /*
   ...
   Здесь долен быть указан основной код эксперта,
   в котором используется значение переменной Money
   ...
   */
   return ;                                       // Выход из start()
  }
//--------------------------------------------------------------------
int deinit()                                     // Спец. ф-ия deinit
  {
   if (Experts == 1 )                             // Если эксперт один..
       GlobalVariableDel (Quantity);               //..удаляем GV-перемен
   else                                          // А иначе..
       GlobalVariableSet (Quantity, Experts- 1 );   //..уменьшаем на 1
   Alert ( "Эксперт выгружен из окна " , Symbol ()); // Сообщ. о выгрузке
   return ;                                       // Выход из deinit()
  }
//--------------------------------------------------------------------

sonra satırda:

Experts= GlobalVariableGet (Quantity);         // Получим тек. знач.

Tamsayı türündeki Experts değişkenini depolama için "GV değişkeni" kutusuna koyuyoruz (çift türe dönüştürerek). O zaman eğer (varsayımsal varsayım) Uzman Danışmanda bir satır olurdu

 int New_Experts=Experts;

o zaman bu, sonucun int türünde bir değişkene yazılması için komutun verildiği anlamına gelir. Bu durumda derleyici:

* double türündeki Experts değişkeninin değerini kutudan çıkar,

* Experts değişkeninin değerinde gerekli değişiklikleri yapacak,

* bu değeri New_Experts değişkenine atar ve...

*, New_Experts değişkeninin değerini "int" kutusuna koyar.

O. değişken tip - bir değere sahip dış ambalajdan/paketlemeden başka bir şey yok mu? ve bu nedenle GV değişkenleri string türünde olamaz, çünkü Aşağıya yayına yalnızca sayısal değerler için izin verilir ve dizeler sayılara dönüştürülmez .

Böyle?

Yanıtınız için şimdiden teşekkür ederiz

 
Stells :
(f=1;f<Bars;f++) için yanlış olan nedir
{
Fiyat1 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,f)) / MarketInfo(Symbol_1, MODE_POINT);
Fiyat2 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,f)) / MarketInfo(Symbol_2, MODE_POINT);
Fark = Fiyat1 - Fiyat2;
Print("Fiyat1="+Fiyat1, "Fiyat2="+Fiyat2);
if (Spread==0){t=f; kırmak;}
}
Fiyat12 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,t)) / MarketInfo(Symbol_1, MODE_POINT);
Fiyat22 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,t)) / MarketInfo(Symbol_2, MODE_POINT);
Spread2 = Fiyat12 - Fiyat22;


if (MathAbs(Spread2) >= razdvizka && Spread2 < 0) { bir ticaret açın }


Yayılmanın sıfıra eşit olduğu çubuğu düzeltmek ve ondan yayılmayı kontrol etmek istiyorum

if( MathAbs (Spread)<eps) { ........ } ve ayrıca sonucu kontrol etmeniz gerekir - koşulu karşılayan bir nokta bulunup bulunmadığı. IMHO, örneğin bunun gibi ayrı bir işlev vermek daha iyidir:

 int GetBarNumWithZerroDist( string Smbl1, string Smbl2, double K, double eps= 0.00001 )
{
int i= 1 ;
double Smb1Cl0 = NrmalizeDouble( iClose (Smbl1, 0 , 0 ));
double Smb2Cl0 = NrmalizeDouble( iClose (Smbl2, 0 , 0 ));
double Smb1Pnt = MarketInfo (Smbl1, MODE_POINT);
double Smb2Pnt = MarketInfo (Smbl2, MODE_POINT);
int     mBars   = MathMin ( iBars (Smbl1), iBars (Smbl2));

     for (i= 1 ;i<mBars;i++) 
    {
         double Price1 =   (Smb1Cl0 - iClose (Symbol_1, 0 ,i)) / Smb1Pnt;
         double Price2 = K*(Smb1Cl0 - iClose (Symbol_2, 0 ,i)) / Smb2Pnt;
         double Spread = Price1 - Price2; 
         //Print ("Price1="+Price1, " Price2="+Price2);
         if ( MathAbs (Spread)< eps) return (i);
    }
     return (- 1 );
}
 

merhaba.

Kim bilir, göstergelerde her zaman aynı periyodu gösterecek şekilde bir #özellik var mı, örneğin d1?

ve metatrader'da zaman çerçevesini değiştirseniz bile değişmedi mi?

Teşekkür ederim

------------------------------------------------

oh... çok fazla profesyonel.....

 

Yardım!!!!

gösterge komut dosyasından nasıl çağrılır, çok gereklidir - böylece pencerede görüntülenebilir

 

iyi akşamlar! Lütfen danışman kodunda değişiklik yapmama yardım edin.
1. Test ederken, her şey yolundadır - ancak ticaret yaparken, ilk anlaşmayı manuel olarak açmanız, bir stop koymanız ve ayrıca bir alım yapmanız gerekir. Danışman etkinleştirildiğinde ve yeni bir tick fiyatı geldiğinde danışmanın otomatik olarak işlem yapmaya başlamasını istiyorum.
2. Stoploss tetiklendiğinde, bir sonraki pozisyon bir öncekinden iki kat lot ile açıldığından, lot teorik olarak sonsuza kadar artabilir (benim durumumda 51.2'ye kadar), sınırlamak istiyorum (örneğin , 0.8) eşiği değiştirme yeteneği ile. Eşiğe ulaşıldığında ve durdurma tetiklendiğinde, danışman kapanmaz, ancak 0.1'den baştan başlar.

 //--- input parameters
extern double     Lot= 0.1 ;
extern int        TP= 22 ;
extern int        SL= 20 ;
extern double     K_Martin= 2 ;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
double oop, ocp, osl, otp, ol; 
int Magic = 0 ;
int closetime= 0 ,lastorder= 0 , tip= 0 ;
for ( int i= 0 ;i< OrdersHistoryTotal ();i++) /* Цикл перебора ордер*/
{
if (! OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)) continue ; // Выбираем ордер из истории.
if ( OrderMagicNumber ()!=Magic) continue ;
if (closetime< OrderCloseTime ())
{
closetime = OrderCloseTime ();
lastorder = OrderTicket ();
tip= OrderType ();
ol= OrderLots ();
}
}
OrderSelect (lastorder,SELECT_BY_TICKET,MODE_HISTORY);
ocp= ( OrderClosePrice ());
oop= ( OrderOpenPrice ());
osl= ( OrderStopLoss ());
otp= ( OrderTakeProfit ());
ol= ( OrderLots ());
Print ( "ОРДЕР №--[" , OrderTicket (), "-" , OrderLots (), "]--" , "цена открытия ОРДЕРА--[" , OrderOpenPrice (), "]" ); 
Print ( "ОРДЕР №--[" , OrderTicket (), "-" , OrderLots (), "]--" , "цена закрытия ОРДЕРА--[" , OrderClosePrice (), "]" );
if ( OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES)==false )
{
if (tip == OP_SELL && osl==ocp) //Ордер SELL закрылся по по SL значит покупаем
{
OrderSend ( Symbol (),OP_BUY,ol*K_Martin,Ask, 0 ,Ask-SL* Point ,Ask+TP* Point , 0 , 0 , 0 , Blue ); /*Если выполняется условие то покупаем*/
}
if (tip == OP_SELL && otp==ocp) //Ордер SELL закрылся по по TP значит продаем
{
OrderSend ( Symbol (),OP_SELL,Lot,Bid, 0 ,Bid+SL* Point , Bid-TP* Point , 0 , 0 , 0 , Red ); /*Если выполняется условие то продаем*/ 
} 
if (tip == OP_BUY && osl==ocp) //Ордер BUY закрылся по SL значит продаем
{
OrderSend ( Symbol (),OP_SELL,ol*K_Martin,Bid, 0 ,Bid+SL* Point ,Bid-TP* Point , 0 , 0 , 0 , Red ); /*Если выполняется условие то продаем*/ 
}
if (tip == OP_BUY && otp==ocp) //Ордер BUY закрылся по по TP значит покупаем
{
OrderSend ( Symbol (),OP_BUY,Lot,Ask, 0 ,Ask-SL* Point ,Ask+TP* Point , 0 , 0 , 0 , Blue ); /*Если выполняется условие то покупаем*/
} 
}
return ( 0 );
}

 
Top2n :

Uzmanlar lütfen yardım edin. Bütün gün sebepsiz yere tıngırdadım.

Sipariş askıda (Ana SATIN AL, SELLSTOP güvenlik ağı bekleniyor)

SELLSTOP'u kayıpsız kapatırken tekrar aynı yere ertelenir.

Bu şeyi döndürün, https://www.mql5.com/en/code/8846 .
 
7777877 :


Sonunda her şeyi doğru anladığımdan emin olmak için lütfen son paragrafınızla ilgili düşüncelerimi kontrol edin ... O halde yukarıda bahsedilen uzmanı alalım:

sonra satırda:

Tamsayı türündeki Experts değişkenini depolama için "GV değişkeni" kutusuna koyuyoruz (çift türe dönüştürerek). O zaman eğer (varsayımsal varsayım) Uzman Danışmanda bir satır olurdu

o zaman bu, sonucun int türünde bir değişkene yazılması için komutun verildiği anlamına gelir. Bu durumda derleyici:

* double türündeki Experts değişkeninin değerini kutudan çıkar,

* Experts değişkeninin değerinde gerekli değişiklikleri yapacak,

* bu değeri New_Experts değişkenine atar ve...

*, New_Experts değişkeninin değerini "int" kutusuna koyar.

O. değişken tip - bir değere sahip dış ambalajdan/paketlemeden başka bir şey yok mu? ve bu nedenle GV değişkenleri string türünde olamaz, çünkü Aşağıya yayına yalnızca sayısal değerler için izin verilir ve dizeler sayılara dönüştürülmez.

Böyle?

Yanıtınız için şimdiden teşekkür ederiz

Kesinlikle bu şekilde değil. Gerçek şu ki, Experts değişkeni zaten int türüne sahip, bu nedenle, tür dönüştürmesi ona bir değer atamadan ÖNCE yapılmalıdır, yani. derleyici

* kutudan bir çift değer çıkardı (programınızda adı yoktur, ancak derleyici tarafından RAM'de veya bir işlemci kaydında bilinen bir adrese yazılır)

* yukarıdaki değişkenin değeriyle gerekli tüm değişiklikleri yaptı ve yeni değeri (zaten int türünde!) Experts değişkenine yazdı,

* bu değeri (int! türünde) New_Experts değişkenine atadı. Aynı türe sahiptirler, bu nedenle, bu sadece bir bellek hücresinden diğerine bir değer aktarımıdır.


Not: Yaptıklarını bu kadar detaylı kavrayan insanların varlığından çok memnunum. Aslında şaka değil. Tekrar iletişime geçin.

 
Andrew1001 :

iyi akşamlar! Lütfen danışman kodunda değişiklik yapmama yardım edin.
1. Test ederken, her şey yolundadır - ancak ticaret yaparken, ilk anlaşmayı manuel olarak açmanız, bir stop koymanız ve ayrıca bir alım yapmanız gerekir. Danışman etkinleştirildiğinde ve yeni bir tick fiyatı geldiğinde danışmanın otomatik olarak işlem yapmaya başlamasını istiyorum.
2. Stoploss tetiklendiğinde, bir sonraki pozisyon bir öncekinden iki kat lot ile açıldığından, lot teorik olarak sonsuza kadar artabilir (benim durumumda 51.2'ye kadar), sınırlamak istiyorum (örneğin , 0.8) eşiği değiştirme yeteneği ile. Eşiğe ulaşıldığında ve durdurma tetiklendiğinde, danışman kapanmaz, ancak 0.1'den baştan başlar.


Denemek:

 extern double Lot= 0.1 ,K_Martin= 2 ,porog= 0.8 ;
extern int TP= 22 ,SL= 20 ,Magic= 233 ;
extern bool poz1_up=true; //ваш выбор:1-ая покупка или продажа(false)? 
extern bool Trade=true; //торговля разрешить?
bool fix; int init(){fix=true; return ( 0 );} int deinit(){ return ( 0 );}
int start(){ double oop,ocp,osl,otp,ol,lotos; int closetime= 0 ,lastorder= 0 ,tip= 0 ; if (!Trade) return ( 0 );
if (poz1_up&&fix){ OrderSend ( Symbol (),OP_BUY,Lot,Ask, 0 ,Ask-SL* Point ,Ask+TP* Point , 0 ,Magic,0, Blue );fix= 0 ;}  
if (!poz1_up&&fix){ OrderSend ( Symbol (),OP_SELL,Lot,Bid, 0 ,Bid+SL* Point ,Bid-TP* Point , 0 ,Magic, 0 , Red );fix= 0 ;}
for ( int i= 0 ;i< OrdersHistoryTotal ();i++)
  { if (! OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)) continue ;
   if ( OrderMagicNumber ()!=Magic) continue ;
   if (closetime< OrderCloseTime ())lastorder= OrderTicket ();}
if ( OrderSelect (lastorder,SELECT_BY_TICKET,MODE_HISTORY))
  {tip= OrderType ();oop= OrderOpenPrice ();osl= OrderStopLoss ();
   otp= OrderTakeProfit ();ol= OrderLots ();ocp= OrderClosePrice ();}
Print ( "ОРДЕР №--[" , OrderTicket (), "-" , OrderLots (), "]--" , "цена открытия--[" , OrderOpenPrice (),
         "]--" , "цена закрытия--[" , OrderClosePrice (), "]--" , "прибыль--[" , OrderProfit (), "]" );
if ( OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES)== 0 )
  { if (tip==OP_SELL){ if (osl==ocp){lotos=ol*K_Martin; if (lotos>porog)lotos=Lot; 
     OrderSend ( Symbol (),OP_BUY,lotos,Ask, 0 ,Ask-SL* Point ,Ask+TP* Point , 0 ,Magic, 0 , Blue );}
     if (otp==ocp) OrderSend ( Symbol (),OP_SELL,Lot,Bid, 0 ,Bid+SL* Point ,Bid-TP* Point , 0 ,Magic, 0 , Red );} 
   if (tip==OP_BUY){ if (osl==ocp){lotos=ol*K_Martin; if (lotos>porog)lotos=Lot;
     OrderSend ( Symbol (),OP_SELL,lotos,Bid, 0 ,Bid+SL* Point ,Bid-TP* Point , 0 ,Magic, 0 , Red );} 
   if (otp==ocp) OrderSend ( Symbol (),OP_BUY,Lot,Ask, 0 ,Ask-SL* Point ,Ask+TP* Point , 0 ,Magic, 0 , Blue );}} return ( 0 );}
//+------------------------------------------------------------------+
 
Merhaba. Bana test cihazında nasıl işlem yapılacağını nerede okuyabileceğini söyle. Teşekkür ederim.