MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 31

 
Vitalie Postolache :
Hata, kodda, sipariş seçimi alanında daha yüksek bir yerdedir.
Evet, geri kalanına dokunmuyorum.
 
spoiltboy :
Evet, geri kalanına dokunmuyorum.
Her durumda, yalnızca koşullu satırları değil, önceki ve sonraki kodu görmeniz gerekir.
 
Artyom Trishkin :
Her durumda, yalnızca koşullu satırları değil, önceki ve sonraki kodu görmeniz gerekir.
harici int puanl=100, noktatp=100, MagicB=1111, MagicS=2222, çubuklar=10; harici çift lotB=0.1, lotS=0.1;
çift slB, tpB, slS, tpS; çift x=0, z=0;


geçersiz OnTick()
{
çift maxpr1=-9999; çift minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iYüksek(Symbol(), PERIOD_CURRENT , shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{çift y=iDüşük(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeÇift(minpr1-pointsl*Nokta,5);
tpB=NormalizeÇift(minpr1+noktatp*Nokta,5);
int biletUP=SiparişGönder(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Kırmızı);
if (ticketUP==-1) Print("HATA OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeÇift(maxpr1+pointsl*Puan,5);
tpS=NormalizeÇift(maxpr1-noktatp*Nokta,5);
int biletD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("HATA OP_SELL"); else Print("OP_SEL TAMAM");}

if (x!=maxpr1){x=maxpr1; OrderDelete(biletD);}
if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}


çift maxpr=-9999; çift minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}}

a dizisi;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Son", a, "maks", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int sayı=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
say++;}}}dönüş(sayım);}

int BuyCount(){
int sayı=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
say++;}}}dönüş(sayım);}

int SellLimitCount(){
int sayı=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
say++;}}}dönüş(sayım);}

int SellCount(){
int sayı=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SEL)
say++;}}}dönüş(sayım);}
 
spoiltboy :
...
Genel olarak, bununla ne yapmaya çalışıyorsunuz, afedersiniz, tüyler ürpertici kod?
 
spoiltboy :

SRC'nin yardımıyla kodu taramak ve normal bir şekilde yerleştirmek - bu kader değil mi?

Silmeyi denemeden önce neden OrderSelect'i kullanmıyorsunuz ?

 
spoiltboy :
...

Birinde emir ve pozisyon sayısı ile ilgili yapının gerekli alanlarını doldurabiliyorken, neden bu kadar çok döngüye ihtiyacınız olduğu açık değil.

Fazlalık kaldırıldı ve kaldırma da kaldırıldı. Biletle silmeniz gerekmez (silmeden önce yine de bilmeniz gerekir), ancak bir döngüde dizine göre istediğiniz sırayı bulun ve silin.

Bu yüzden, bir koşul oluştuğunda çağrılması gereken siparişleri aramak ve silmek için bir fonksiyona daha ihtiyacımız var, ancak kodunuza bakarken hangisinin hemen anlamadım ve bunu anlamaya zaman yoktu. Gerekli koşulları kelimelerle anlatın, nasıl sileceğinizi anlatalım.

Dizime bakmadan yazdım, bu yüzden yapıyı sipariş ve pozisyon sayısı ile doldurma işlevinde söveler olabilir - kontrol etmedim.

//--- input variables
input      double    LotB= 0.1 ;       // Лот Buy
input      double    LotS= 0.1 ;       // Лот Sell
input      int       Pointsl= 100 ;   // StopLoss в пунктах
input      int       Pointtp= 100 ;   // TakeProfit в пунктах
input      int       NumBars= 10 ;     // Количество баров для поиска Max/Min
input      int       Magic= 100500 ;   // Magic

//--- global variables
struct DataNumOrders
  {
   int buy;           // Количество позиций Buy
   int sell;         // Количество позиций Sell
   int buy_limit;     // Количество ордеров BuyLimit
   int buy_stop;     // Количество ордеров BuyStop
   int sell_limit;   // Количество ордеров SellLimit
   int sell_stop;     // Количество ордеров SellStop
  };
DataNumOrders numOrders;   // Количество ордеров
double lotB, lotS;
int     pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   numBars=(NumBars< 1 ? 1 :NumBars> Bars ? Bars :NumBars);
   pointsl=(Pointsl< 0 ? 0 :Pointsl);
   pointtp=(Pointtp< 0 ? 0 :Pointtp);
   double minLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
   double maxLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );
   lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
   lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   //--- заполним структуру количеством ордеров и позиций
   GetNumOrders( Symbol (),Magic,numOrders);
  
   //--- найдём максимальную и минимальную цены за bars свечей
   double maxPrice= 0.0 ; double minPrice= DBL_MAX ;
   for ( int i= 0 ; i<numBars; i++) {
       double max_i= iHigh ( Symbol (), PERIOD_CURRENT ,i);
       if (max_i>maxPrice) maxPrice=max_i;
       double min_i= iLow ( Symbol (), PERIOD_CURRENT ,i);
       if (min_i<minPrice) minPrice=min_i;
      }

   //--- выставим BuyLimit
   if (numOrders.buy_limit== 0 && numOrders.buy== 0 ) {
       double slB=(pointsl== 0 ? 0 : NormalizeDouble (minPrice-pointsl* Point (), Digits ()));
       double tpB=(pointtp== 0 ? 0 : NormalizeDouble (minPrice+pointtp* Point (), Digits ()));
       int ticketUP= OrderSend ( Symbol (), OP_BUYLIMIT , lotB, minPrice, 3 , slB, tpB, "" , Magic, 0 , clrRed );
       if (ticketUP==- 1 ) Print ( "ERROR OP_BUY" );
       else Print ( "OP_BUY OK" );
      }
   //--- выставим SellLimit
   if (numOrders.buy_limit== 0 && numOrders.sell== 0 ) {
       double slS=(pointsl== 0 ? 0 : NormalizeDouble (maxPrice+pointsl* Point (), Digits ()));
       double tpS=(pointtp== 0 ? 0 : NormalizeDouble (maxPrice-pointtp* Point (), Digits ()));
       int ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, maxPrice, 3 , slS, tpS, "" , Magic, 0 , clrBlue );
       if (ticketD==- 1 ) Print ( "ERROR OP_SELL" );
       else Print ( "OP_SELL OK" );
      }

   //--- Тут должно быть удаление, но не понятно при каких условиях. Опишите их
  
  
   //---
   string a=(numBars== 1 )? "bar: " : IntegerToString (numBars, 1 )+ " bar's: " ;
   Comment ( "Last " , a, "max " , DoubleToStr (maxPrice, Digits ()), ", min " , DoubleToStr (minPrice, Digits ()), "." );
  }
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров   |
//+------------------------------------------------------------------+
void GetNumOrders( string symbol_name, int magic_number, DataNumOrders &number_of) {
   ZeroMemory (number_of);
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS )) {
         if ( OrderMagicNumber ()!=magic_number) continue ;
         if ( OrderSymbol ()!=symbol_name)       continue ;
         if ( OrderType ()== OP_BUY )       number_of.buy++;
         if ( OrderType ()== OP_BUYLIMIT )  number_of.buy_limit++;
         if ( OrderType ()== OP_BUYSTOP )   number_of.buy_stop++;
         if ( OrderType ()== OP_SELL )      number_of.sell++;
         if ( OrderType ()== OP_SELLLIMIT ) number_of.sell_limit++;
         if ( OrderType ()== OP_SELLSTOP )  number_of.sell_stop++;
         }
      }
}
//+------------------------------------------------------------------+
 
Artyom Trishkin :
Genel olarak, bu, üzgünüm, tüyler ürpertici kodla ne yapmaya çalışıyorsunuz?
EA, son X çubuğu için minimum ve maksimum hesaplar ve bunlara siparişler verir. Ayrıca, maksimum düşüş veya minimum artış olduğunda, ilgili siparişi silmeniz ve yeni verileri kullanarak açmanız gerekir.


 

aşağıdakiler nasıl yazılır:

Fiyat %1 değiştiyse , günün AÇILIŞI, günün kapanışından %1 fazla diyelim.

 
Movlat Baghiyev :

aşağıdakiler nasıl yazılır:

Fiyat %1 değiştiyse, diyelim ki günün AÇILIŞI, günün Kapanış saatinden %1 fazla olsun.

Eh, bu başka bir konu, şimdi %1'in neye göre olduğu açık;)

if ( Open [x] > Close [x]+ Open [x]* 0.01 ) {code}
 
spoiltboy :
EA, son X çubuğu için minimum ve maksimum hesaplar ve bunlara siparişler verir. Ayrıca, maksimum düşüş veya minimum artış olduğunda, ilgili siparişi silmeniz ve yeni verileri kullanarak açmanız gerekir.


Kurulum fiyatını değiştirip yeni seviyeye göre bir alımla durdurmak varken neden silesiniz? Ne de olsa, yalnızca mevcut değillerse ve piyasa pozisyonu yoksa mevduat ayarladınız. Bunun anlamı: piyasada bekleyen bir emir varsa ve buna karşılık gelen bir piyasa pozisyonu yoksa, o zaman sadece bekleyen emrin fiyatlarını - yeni bir seviyeye ayarlamanın fiyatını ve durdurma emirlerini - buna göre değiştirmeniz gerekir. yeni seviye.

Her seferinde, bulunan Max ve Min fiyatlarını hatırlayın. Mevcut bulunan Maks fiyat öncekinden düşükse, bekleyen BuyLimit'i değiştirir ve yeni Maks fiyatı saklarız. Min - ayna fiyatına.

Neden: