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

 
Ozero :

Perez ";" braket için.

Program çalışıyor, AMA periyodik olarak 4108 hatasına yemin ediyor.


Göl.

Yardımı açıyoruz, çalışma zamanı hatalarına bakıyoruz, şunu görüyoruz:

4108

ERR_INVALID_TICKET

Geçersiz bilet numarası

aradığımızı sanıyoruz...

 

İnsanlar yardım ediyor, açık bir emirden sonra ayırt etmek ve ayırt etmek için her para biriminde kendi emirleriyle işlem yapmak gerekiyor, fiyat daha da gerilerse, ilkiyle aynı başka bir emir açabilirim.

 //+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
 
extern double TakeProfit = 50 ;
extern double Lots = 0.1 ;
extern double TrailingStop = 30 ;
extern double MACDOpenLevel= 3 ;
extern double MACDCloseLevel= 2 ;
extern double MATrendPeriod= 26 ;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt= 0 , ticket, total;
// первичные проверки данных
// важно удостовериться что эксперт работает на нормальном графике и
// пользователь правильно выставил внешние переменные (Lots, StopLoss,
// TakeProfit, TrailingStop)
// в нашем случае проверяем только TakeProfit
   if ( Bars < 100 )
     {
       Print ( "bars less than 100" );
       return ( 0 );  
     }
   if (TakeProfit< 10 )
     {
       Print ( "TakeProfit less than 10" );
       return ( 0 );   // проверяем TakeProfit
     }
// ради упрощения и ускорения кода, сохраним необходимые
// данные индикаторов во временных переменных
   MacdCurrent= iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, 0 );
   MacdPrevious= iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, 1 );
   SignalCurrent= iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_SIGNAL, 0 );
   SignalPrevious= iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_SIGNAL, 1 );
   MaCurrent= iMA ( NULL , 0 ,MATrendPeriod, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   MaPrevious= iMA ( NULL , 0 ,MATrendPeriod, 0 , MODE_EMA , PRICE_CLOSE , 1 );
 
   total= OrdersTotal ();
   if (total< 1 ) 
     {
       // нет ни одного открытого ордера
       if (AccountFreeMargin()<( 1000 *Lots))
        {
         Print ( "We have no money. Free Margin = " , AccountFreeMargin());
         return ( 0 );  
        }
       // проверяем на возможность встать в длинную позицию (BUY)
       if (MacdCurrent< 0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs (MacdCurrent)>(MACDOpenLevel* Point ) && MaCurrent>MaPrevious)
        {
         ticket= OrderSend ( Symbol (),OP_BUY,Lots,Ask, 3 , 0 ,Ask+TakeProfit* Point ,
                           "macd sample" , 16384 , 0 ,Green);
         if (ticket> 0 )
           {
             if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print ( "BUY order opened : " ,OrderOpenPrice());
           }
         else Print ( "Error opening BUY order : " , GetLastError ()); 
         return ( 0 ); 
        }
       // проверяем на возможность встать в короткую позицию (SELL)
       if (MacdCurrent> 0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel* Point ) && MaCurrent<MaPrevious)
        {
         ticket= OrderSend ( Symbol (),OP_SELL,Lots,Bid, 3 , 0 ,Bid-TakeProfit* Point ,
                           "macd sample" , 16384 , 0 ,Red);
         if (ticket> 0 )
           {
             if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print ( "SELL order opened : " ,OrderOpenPrice());
           }
         else Print ( "Error opening SELL order : " , GetLastError ()); 
         return ( 0 ); 
        }
       return ( 0 );
     }
   // переходим к важной части эксперта - контролю открытых позиций
   // 'важно правильно войти в рынок, но выйти - еще важнее...'
   for (cnt= 0 ;cnt<total;cnt++)
     {
       OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
       if (OrderType()<=OP_SELL &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()== Symbol ())   // инструмент совпадает?
        {
         if (OrderType()==OP_BUY)   // открыта длинная позиция
           {
             // проверим, может уже пора закрываться?
             if (MacdCurrent> 0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel* Point ))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid, 3 ,Violet); // закрываем позицию
                 return ( 0 ); // выходим
                }
             // проверим - может можно/нужно уже трейлинг стоп ставить?
             if (TrailingStop> 0 )  
              {                 
               if (Bid-OrderOpenPrice()> Point *TrailingStop)
                 {
                   if (OrderStopLoss()<Bid- Point *TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,
                                 OrderTakeProfit(), 0 ,Green);
                     return ( 0 );
                    }
                 }
              }
           }
         else // иначе это короткая позиция
           {
             // проверим, может уже пора закрываться?
             if (MacdCurrent< 0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs (MacdCurrent)>(MACDCloseLevel* Point ))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask, 3 ,Violet); // закрываем позицию
               return ( 0 ); // выходим
              }
             // проверим - может можно/нужно уже трейлинг стоп ставить?
             if (TrailingStop> 0 )  
              {                 
               if ((OrderOpenPrice()-Ask)>( Point *TrailingStop))
                 {
                   if ((OrderStopLoss()>(Ask+ Point *TrailingStop)) || (OrderStopLoss()== 0 ))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+ Point *TrailingStop,
                                 OrderTakeProfit(), 0 ,Red);
                     return ( 0 );
                    }
                 }
              }
           }
        }
     }
   return ( 0 );
  }
// конец.
 

Merhaba !

Az önce NormalizeDouble'ın garip çalışmasını fark ettim.

Yani danışman iyi çalışıyor ve hata vermiyor, ancak test cihazındaki günlükler çok garip.

Açıklamama izin ver.

Kar fonksiyonunu hesaplıyorum. Beklendiği gibi yapıyorum NormalizeDouble(Profit,Digits);

Sonraki Yazdır(" kâr=",DoubleToStrMorePrecision(Kar,8));

Sonuç olarak, günlüklerde şunu görüyorum: "profit=0.88881912". Teoride 0.88881000 olmalı değil mi?

Yoksa aptal mıyım ve yanlış bir şey mi yapıyorum?

 
goodearth :

Merhaba !

Az önce NormalizeDouble'ın garip çalışmasını fark ettim.

Yani danışman iyi çalışıyor ve hata vermiyor, ancak test cihazındaki günlükler çok garip.

Açıklamama izin ver.

Kar fonksiyonunu hesaplıyorum. Beklendiği gibi yapıyorum NormalizeDouble(Profit,Digits);

Sonraki Yazdır(" kâr=",DoubleToStrMorePrecision(Kar,8));

Sonuç olarak, günlüklerde şunu görüyorum: "profit=0.88881912". Teoride 0.88881000 olmalı değil mi?

Yoksa aptal mıyım ve yanlış bir şey mi yapıyorum?

İşlem emirlerine dahil olan bir Kar değeriniz var mı?
 
artmedia70 :
İşlem emirlerine dahil olan bir Kar değeriniz var mı?

Tabiiki. Ve hatasız :-). Bu yüzden şaşırdım.

Build 735 var

Ticaret demoda.

Aaaaaaa anladım! Atama işlemini unuttum :-). "Kar=NormalizeÇift(Kar,Rakamlar)".

Gerçek, danışmanın neden hata vermediği hala net değil))

Belki sunucuda otomatik olarak yuvarlarlar .....

Nedense bana NormalizeDouble'ın bir işlev değil bir prosedür olduğunu düşündüm :-).

 
Ozero :

Perez ";" braket için.

Program çalışıyor, AMA periyodik olarak 4108 hatasına yemin ediyor.


Göl.

Aslında, onu kaldırmalısın!

 
borilunad :

Aslında, onu kaldırmalısın!

Boris, ona doğrudan kodu göstersen daha iyi olurdu, yoksa uykusuzluktan unuttum ...;)

 ResetLastError ();
if (!OrderClose(OrderTicket(),OrderLots(),_Bid, 15 )) Print ( "Чё-та не закрылася позиция. Фигня вот такая происходит: " + GetLastError ());
 
artmedia70 :

Boris, ona doğrudan kodu göstersen daha iyi olurdu, yoksa uykusuzluktan unuttum ...;)

Telif hakkınızı kötüye kullanmak istemedim! ;)

Ama cidden, bir şey eklenmemiş! Ama şimdi deneyeceğim!

 ResetLastError ();
if (!OrderClose(OrderTicket(),OrderLots(),_Bid, 15 )) Print ("");

Ve şimdi işe yaradı! Garip!

 
Merhaba

Lütfen bana çözümü söyleyin.

Editörün 500. yapısı ile hatasız derleyen bir danışman var.

Ama yeni sürümde hata veriyor. Bunlar gibi:

 bool TP?= true ;   // ошибка  '?' - semicolon expected    
ama bu konuda zaten iki kez

 if (TP?)     // ')' - unexpected token    
           // ')' - ':' colon sign expected     
Yeni sürüm ve eski sürüm için kılavuza baktım ama soru işaretiyle ilgili benzer bir şey bulamadım.

Soru: Bu işlemler ne anlama geliyor ve kodun normal şekilde derlenmesi için bunları nasıl düzeltebilirim?

Şimdiden teşekkürler


 

Merhaba! Lütfen bana if esle ifadesinin neden bazen benim için çalışmadığını söyleyin.
İşte bir örnek:

 double H3=ObjectGet ( "H3 line" , OBJPROP_PRICE1);
int start()
{
double price = Bid;
if (price==H3)
{
 Alert ( "Урааааа  " , Symbol ());
}
return ( 0 );
}

Neresi:
H3, seviyenin fiyat değeridir
fiyat - cari fiyat

Sonuç olarak, fiyatın bu seviyeye ulaştığı ortaya çıkıyor (bazen bu seviyede duruyor), ancak Uyarı çalışmıyor.
Bana neyin yanlış olduğunu söyle?

Neden: