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

 

İyi akşamlar! nasıl anlayacağımı söyle

Mevcut bekleyen emirler ve açık pozisyonlar hariç, cari hesapta ve mevcut piyasa ortamında belirtilen emir türü için gerekli teminat tutarı.

Mevcut işlevi yaklaşık olarak tahmin edebilir misiniz?

 

Bu işlevi çok yerine kullanmaya başladım

 double      Lott  ( double      Lot ){
     if ( risk!= 0 )  Lot=AccountFreeMargin()*risk/ 10000 ; return (Lot);}  

Oldukça sık OrderSend hatası 131 yazıyor - yanlış birim. 10.000'lik bir başlangıç deposu ile ilk lot 1'dir. Ancak, bir şeyler çalışmıyor..

 

Bazen denemek Yalnızca son iki satın alma pozisyonunu kapatmak için kapanış satın alma pozisyonu bloğunu yeniden yapın , ancak işe yaramıyor . önerebilir misin gibi blok değiştir?

 void Close_2buy()
{
   bool    result;
   double   close_price;
   int     cmd,error;
   bool close;

       for ( int f= OrdersTotal ()- 1 ; f>= 0 ; f--) // 
      {
         OrderSelect (f, SELECT_BY_POS);
         if (OrderSymbol()== Symbol () &&(OrderMagicNumber()==magic ) 
         && (OrderType() == OP_BUY )) 
         {
            close = False;
            {
               close_price = MarketInfo(OrderSymbol(), MODE_BID);
               close = True;
            }
               
             if (close) 
            {
               result=OrderClose(OrderTicket(), OrderLots(), close_price, 0 , CLR_NONE );
               if (result!=TRUE)
               {error= GetLastError (); Print ( "LastError = " , error);}
            }
            
         }
      }
}
 
Dimka-novitsek :

Bu işlevi çok yerine kullanmaya başladım

Oldukça sık OrderSend hatası 131 yazıyor - yanlış birim. 10.000'lik bir başlangıç deposu ile ilk lot 1'dir. Ancak, bir şeyler çalışmıyor..


Bunu kullanıyorum. Kendiniz için ince ayar yapın ve deneyin.(HesapBalance()'i AccountFreeMargin() olarak değiştirin, LotsDigits değişkeninizi koyun)
 //+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link       ""
////////////////////////////////////////////////////////////////////////|
extern int      Method         = 1 ;       // Метод: 0-FixedLots, 1-часть //|
                                       //(Risk) от свободных средств  //|
                                       // нормированных по значению   //|
                                       // MeansStep(например Risk=    //|
                                       // 0.01,MeansStep=1000,если    //|
                                       // средств меньше 2000,лот     //|
                                       // равен 0.01,если средств     //|
                                       // стало 2000 или более - 0.02 //|
                                       // лота, 3000 или более - 0.03 //|
                                       // лота и т.д.).               //|
                                                                       //|
extern double   LOTS           = 0.01 ;   // Количество лотов при        //|
                                       // Method=0.                   //|
                                                                       //|
extern double   Risk           = 0.01 ;   // Риск. Часть от средств при  //|
                                       // FixedLot=false.             //|
                                                                       //|
extern double   MeansStep      = 100.0 ;   // Шаг средств. Используется   //|
                                       // при Method=1.               //|     
////////////////////////////////////////////////////////////////////////|
//+------------------------------------------------------------------+//|
//|  Определяем "свой" минимальный размер или шаг лота на момент     |//|
//|  начала цикла в зависимости от размера баланса и установленного  |//|
//|  риска.                                                          |//|
//+------------------------------------------------------------------+//|
////////////////////////////////////////////////////////////////////////|
double fGetLotsSimple()                                               //|
   {                                                                   //|
   double LOTSTEP,lot;                                                 //|
   double Means;                                                       //|
   switch (Method)                                                     //|
      {                                                               //|
       case 0 :                                                         //|
         lot=LOTS;                                                     //|
       break ;                                                           //|
       case 1 :                                                         //|
         Means=AccountBalance();                                       //|
         if (Means<MeansStep)Means=MeansStep;                           //|
         lot=(MeansStep* MathFloor (Means/MeansStep))/MeansStep*Risk;   //|
       break ;                                                           //|
       default :lot=LOTS;                                               //|
   }                                                                   //|
   if (lot< 1.0 / MathPow ( 10 ,LotsDigits))lot= 1.0 / MathPow ( 10 ,LotsDigits);   //|
   LOTSTEP=MarketInfo( Symbol (),MODE_LOTSTEP);                         //|
   lot= MathFloor (lot/LOTSTEP)*LOTSTEP;                                 //|
   lot= NormalizeDouble (lot,LotsDigits);                               //|
   if (lot>AccountFreeMargin())lot=- 1 ;                                 //|
   return (lot);                                                       //|
}                                                                     //|
////////////////////////////////////////////////////////////////////////|
)
 

Bu kodda neyin yanlış olabileceğini söyleyebilir misiniz? Bu, takip eden bir durdurmaya benzer, ancak test ederken, değiştirildiğinde 1 hatası verir. Sipariş neden değiştirilmiyor?

Ayrıca, bu hatayı düzelttiğimde (şimdiye kadar başarısız), derleme sırasında Expert Advisor'ın ana kodundan yazdırma işlevine bir hata döndürmeye başladı, yeterli alıntı olmadığını ve orada her şeyin doğru ayarlandığını yazıyor ve Bu hatayı düzeltmek için alıntıyı kaldırmanız ve yeniden alıntı yapmanız gerekir. .

bool takip durdur()
{
if ((OrderMagicNumber()==11111)==true)
{
Print("Satın alma pozisyonunu koruyoruz");
while(OrderCloseTime()==0)
{
if ((Bid-OrderStopLoss())>(StopLevel*Nokta))
{
if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Bid-StopLevel*Point),0,0))
Print("Sipariş Kaybını Durdur ", OrderTicket()," ve sihirli sayı ",OrderMagicNumber(),", başarıyla değiştirildi ",OrderStopLoss());
else Print("",OrderTicket()," ve sihirli sayı ",OrderMagicNumber()," emrinin Zarar Durdurma düzeyi taşınamadı. Hata ",GetLastError());
}
}
if (OrderCloseTime()>0)
{
Print("Numaralı sipariş ", OrderTicket()," ve sihirli sayı ",OrderMagicNumber(),", kapalı fiyattan ",OrderClosePrice(),", kâr/zararlı ",OrderProfit());
dönüş(doğru);
}
}
başka
{
if ((OrderMagicNumber()==22222)==true)
{
Print("Satış pozisyonunun korunması");
while(OrderCloseTime()==0)
{
if ((OrderStopLoss()-Ask)>(StopLevel*Nokta))
{
if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Ask+StopLevel*Point),0,0))
Print("OrderTicket()," numaralı sipariş Kaybını Durdur ve sihirli sayı ",OrderMagicNumber(),", başarıyla değiştirildi ",OrderStopLoss());
else Print("",OrderTicket()," ve sihirli sayı ",OrderMagicNumber()," emrinin Zarar Durdurma düzeyi taşınamadı. Hata ",GetLastError());
}
}
if (OrderCloseTime()>0)
{
Print("Numaralı sipariş ", OrderTicket()," ve sihirli sayı ",OrderMagicNumber(),", kapalı fiyattan ",OrderClosePrice(),", kâr/zararlı ",OrderProfit());
dönüş(doğru);
}
}
başka dönüş(yanlış);
}
}
 
Teşekkürler!!
 
Ekburg :

Bu kodda neyin yanlış olabileceğini söyleyebilir misiniz? Bu, takip eden bir durdurmaya benzer, ancak test ederken, değiştirildiğinde 1 hatası verir. Sipariş neden değiştirilmiyor?

Ayrıca, bu hatayı düzelttiğimde (şimdiye kadar başarısız), derleme sırasında Expert Advisor'ın ana kodundan yazdırma işlevine bir hata döndürmeye başladı, yeterli alıntı olmadığını ve orada her şeyin doğru ayarlandığını yazıyor ve Bu hatayı düzeltmek için alıntıyı kaldırmanız ve yeniden alıntı yapmanız gerekir. .

bool takip durdur()
{
if ((OrderMagicNumber()==11111)==true)
{
Print("Satın alma pozisyonunu koruyoruz");
while(OrderCloseTime()==0)
{
if ((Bid-OrderStopLoss())>(StopLevel*Nokta))
{
if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Bid-StopLevel*Point),0,0))
Print("OrderTicket()," numaralı sipariş Kaybını Durdur ve sihirli sayı ",OrderMagicNumber(),", başarıyla değiştirildi ",OrderStopLoss());
else Print("",OrderTicket()," ve sihirli sayı ",OrderMagicNumber()," emrinin Zarar Durdurma düzeyi taşınamadı. Hata ",GetLastError());
}
}
if (OrderCloseTime()>0)
{
Print("Numaralı sipariş ", OrderTicket()," ve sihirli sayı ",OrderMagicNumber(),", kapalı fiyattan ",OrderClosePrice(),", kâr/zararlı ",OrderProfit());
dönüş(doğru);
}
}
başka
{
if ((OrderMagicNumber()==22222)==true)
{
Print("Satış pozisyonunun korunması");
while(OrderCloseTime()==0)
{
if ((OrderStopLoss()-Ask)>(StopLevel*Nokta))
{
if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Ask+StopLevel*Point),0,0))
Print("OrderTicket()," numaralı sipariş Kaybını Durdur ve sihirli sayı ",OrderMagicNumber(),", başarıyla değiştirildi ",OrderStopLoss());
else Print("",OrderTicket()," ve sihirli sayı ",OrderMagicNumber()," emrinin Zarar Durdurma düzeyi taşınamadı. Hata ",GetLastError());
}
}
if (OrderCloseTime()>0)
{
Print("Numaralı sipariş ", OrderTicket()," ve sihirli sayı ",OrderMagicNumber(),", kapalı fiyattan ",OrderClosePrice(),", kâr/zararlı ",OrderProfit());
dönüş(doğru);
}
}
başka dönüş(yanlış);
}
}


Hata 1 bir hata değildir. bu, siparişin zaten değiştirildiği anlamına gelir. OrderModify()'dan önce değişiklik parametrelerini kontrol edin ( sipariş stoploss stoploss , (ND(Bid-StopLevel*Point) veya ND(Ask+StopLevel*Point) ) ile eşit değilse, ardından OrderModify() , aksi takdirde -- return).
 
rigonich :

Hata 1 bir hata değildir. bu, siparişin zaten değiştirildiği anlamına gelir. OrderModify()'dan önce değişiklik parametrelerini kontrol edin (sipariş stoploss stoploss , (ND(Bid-StopLevel*Point) veya ND(Ask+StopLevel*Point) ) ile eşit değilse, ardından OrderModify() , aksi takdirde -- return).


Yani bu kontrol daha yüksek: if ((Bid-OrderStopLoss())>(StopLevel*Point)) veya ben sizi yanlış anladım

keskin bir hareket üzerinde test ettiğimde, orada görsel olarak bile, stop emirlerinin ve ifadelerin eşit olmadığı açıkça görülüyor.

 
Usual_Trader :


Hazırlıksız, siparişleri kapatma işlevinde, siparişe göre bir sipariş seçmeniz gerekiyor OrderSelect(Ticket, SELECT_BY_TICKET) , Lts değişkeninde olmayan lot sayısını belirtin, çünkü her seferinde yeniden hesaplanır, ancak OrderLots kullanın () Ve bir şey daha - sırasıyla 0. çubuk üzerinde çalışmaya devam ederseniz, bir çubuktaki kriterler kaybolabilir, siparişleriniz istediğiniz yerde açılmayabilir. Gösterge parametrelerinde çubuğu 0'dan 1'e, 1'den 2'ye değiştirin



Cevap için çok teşekkürler), ama burada kriterler yine gerektiği gibi çalışmıyor, ekranda görebilirsiniz (siparişler ( ) stokastiğin tüm kesişimleri için çalışmıyor ve yine de 0 barda çalışmak istiyorum , ancak bunun için, anladığım kadarıyla, ek koşula ihtiyacınız var: mevcut çubukta bir sipariş açtıktan sonra, çubuk kapanana kadar hiçbir şey yapmayın, ancak nasıl uygulanacağını bilmiyorum (belki zaman serisi dizileri aracılığıyla ??? ) Söyle bana.
Dosyalar:
 
Ekburg :


Yani bu kontrol daha yüksek: if ((Bid-OrderStopLoss())>(StopLevel*Point)) veya ben sizi yanlış anladım

keskin bir hareket üzerinde test ettiğimde, orada görsel olarak bile, stop emirlerinin ve ifadelerin eşit olmadığı açıkça görülüyor.


Sorun şudur: Bu işlevde OrderSelect() bulunmadığından, sipariş döngüsünde bir yerde kullanılmış gibi görünüyor. Bu döngü, sıfırdan sonuncuya bir arama düzenlerse, o zaman ilk sıranın değiştirilmesinden sonra veya örneğin, bu işaret üzerinde bir emir kapatılmışsa, OrderSelect() işlevi bir sonraki çağrıldığında, sipariş emir değişiklikleri ve fonksiyon, halihazırda değiştirilmiş olan bir emri değiştirmek için seçebilir. Bu nedenle, emrin stop loss değerinin OrderModify() fonksiyonuna ilettiğimiz değere eşit olup olmadığını kontrol etmemiz gerekiyor.

 if (ND(Bid-StopLevel* Point )==OrderStopLoss()) return ( true );