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

 

Yardıma ihtiyacım var - stop flips - 3 sipariş, ancak video eğitimlerinden takip örneği :) sadece alakasız siparişler için, ancak benim için bir algoritma ile bağlılar, yani kar al üç siparişin toplamı ile hesaplanır , ya da hemen trendi yakalarsa. Şey, bir şey buldum, ancak danışman daha fazla kazanmadı - aynı miktarı kazanmaya başladı, ancak bir öncekine kıyasla 2-3 kat daha az işlem takip etmeden elde edildi. Genel olarak, izim yok, ancak bir tür bulanıklık var. İlgili siparişler için nasıl yapabilirim bana fikir verebilecek olan var mı? Korkarım başka bir şey bulamayacağım, işte "sondaki" sonucumun sonucu - mavi renkle vurgulanmış:

1. testin sonucu ektedir. Takip eden bir durak var mı, yok mu? Anlamıyorum. Aynı döneme ait kâr miktarı neden artmadı? Ve sadece işlem sayısı 2-3 kat azaldı?

//+------------------------------------------------------------------+
//|                                     BLACKJACK&HOOKERS TrailX.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  Lots           = 0.01;
extern int     TakeProfit     = 5;
extern int     Step           = 2;

extern int     TrailingStep   = 3;
extern int     TrailingStop   = 1;

extern int     MaPeriod       = 200;
extern int     MaShift        = 1;

extern int     Magic          = 123;
extern int     Slippage       = 5;

int timeprev=0;

extern double price,op,cn,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{  if (timeprev == Time[0]) return;
   timeprev = Time[0];
   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
   op=CalculateProfit();
   cn=CountTrades();
   tp=TakeProfit;
   if(tp>TakeProfit)
   {
      TakeProfit+=tp;
   }

   
 

 
   if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
   {
      if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue)<0)
            Print("Не удалось открыть ордер на покупку");
            
   }
   
   if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
   {
      if (OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red)<0)
            Print("Не удалось открыть ордер на продажу");
            
   }
   

   
   if(cn==1 && CountBuy()==1)//CountBuy()==1 && 
   {
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на продажу");
      }
   }
   else if(cn==1 && CountSell()==1)//CountSell()==1 && 
   {
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
      }
   }
   
   
   
   if(cn==2 && CountBuy()==1 && CountSell()==1)//CountBuy() + CountSell()==2 && 
   {
      price=FindLastSellPrice();
      if((price-Bid)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   else if(cn==2 && CountSell()==1 && CountBuy()==1)//CountSell() + CountBuy()==2 && 
   {
      price=FindLastBuyPrice();
      if((Ask-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   
   Trailing();

   

   if (op>=tp)
   {
         CloseAll();    
   }
   
   

 
   
   
   
   
   
   
   






}    
//---------------------------------------------------------------------------------------
//   double Equity() //или OrderProfit() - эти идеи в работе и задуманы как автоподбор лота (без мартингейла) для снижения рисков от контрдвижения (интервенций) рынка 
//   {
//      double eqv=0;
//      eqv+=AccountEquity();
//      return(eqv);     
//   }
//---------------------------------------------------------------------------------------
void Trailing()

{
   for (int i=OrdersTotal() -1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderType() == OP_BUY)
            
            {
               price=FindLastBuyPrice();   
               if (Bid - price > (TakeProfit+TrailingStep)*Point)
               {
                  {
                     tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits);
                  }
               }
               if (price - (TakeProfit-TrailingStop)*Point < Bid - (TakeProfit+TrailingStep)*Point)
               {
                  {
                     tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits);
                  }
               }
            }
            
            if (OrderType() == OP_SELL)
            {
               price=FindLastSellPrice();
               if (price - Ask > (TakeProfit+TrailingStep)*Point)
               {  
                  {
                     tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits);
                  }
               }
               if (price - (TakeProfit-TrailingStop)*Point > Ask + (TakeProfit+TrailingStep)*Point)
               {  
                  {
                     tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits);
                  }
               }
            }
         }
      }
   }
}
//---------------------------------------------------------------------------------------
double CalculateProfit()
  {
   double oprofit=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               oprofit+=OrderProfit();
              }
           }
        }
     }
   return(oprofit);
  }
//--------------------------------------------------------------------------------------
void CloseAll()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Print("Не удалось закрыть ордер на покупку");
              }
            if(OrderType()==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Print("Не удалось закрыть ордер на продажу");
              }
           }
        }
     }
  }
//---------------------------------------------------------------------------------------------------
double FindLastBuyPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//---------------------------------------------------------------------------------------------------
double FindLastSellPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//----------------------------------------------------------------------------------------------
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            count++;
        }
     }
   return(count);
  }
//----------------------------------------------------------------------------------------------
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+---------------------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
      {  
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  count++; 
         }
      }
      return(count);
}
//----------------------------------------------------------------------------------+
int FindLastOrderType()
{
      for(int i = OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            return(OrderType());
         } 
      }
      return(-1);
}
//----------------------------------------------------------------------------------+



Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc :

Yardıma ihtiyacım var - stop flips - 3 siparişim var, ancak takip eden örnek yalnızca alakasız siparişler için, ancak benim için bir algoritma ile bağlılar, yani kar al üç emrin toplamı ile hesaplanır veya eğer öyleyse bir hemen trendi vur. Şey, bir şey buldum, ancak danışman daha fazla kazanmadı - aynı miktarı kazanmaya başladı, ancak bir öncekine kıyasla 2-3 kat daha az işlem takip etmeden elde edildi. Genel olarak, izim yok, ancak bir tür bulanıklık var. İlgili siparişler için nasıl yapabilirim bana fikir verebilecek olan var mı? Korkarım başka bir şey bulamayacağım, işte "sondaki" sonucumun sonucu - kırmızıyla vurgulanmış:


Birinin bir ayak örtüsü şeklinde ortaya koyduğunuzu kodunuzu anlayacağını düşünüyor musunuz?
 
Vitaly Muzichenko :
Birinin bir ayak örtüsü şeklinde ortaya koyduğunuzu kodunuzu anlayacağını düşünüyor musunuz?

Nasıl gösterilmelidir? Pekala, bir parça kod atamam, aksi halde neyin ne olduğu belli olmaz.
 
geratdc :

Nasıl gösterilmelidir? Pekala, bir parça kod atamam, aksi halde neyin ne olduğu belli olmaz.

En azından şöyle:


 
Vitaly Muzichenko :

En azından şöyle:



Birisi yeniden yaptı. Böylesi daha iyi, teşekkürler.
 


Arkadaşlar MQL4 öğreniyorum ve Lazy Trader sistemi için Expert Advisor yazmaya karar verdim.
Expert Advisor yazıldı ama düzgün çalışmıyor. Gördüğüm hata, siparişlerin zamana göre kapanmamasıdır. Belki başka hatalar da vardır.


Lütfen hataları bulmaya yardımcı olun ve gördüğünüz kod hakkında geri bildirimde bulunun.

İşte Expert Advisor yazdığım sistemin kuralları:

1/ Haftanın başında ilk dört saatlik mumun kapanmasını bekliyoruz.
2/ Bekleyen Alış Durdurma ve Satış Durdurma emirlerini bu mumun Yüksek'in 20 pip üzerinde ve Düşük'ün 20 pip altında yerleştirin.
3/ Zararı durdur, karşıt emir seviyesinde yer alır. Kar al ayarlanmadı.
4/ Emir, zararı durdurmaya eşit bir kara ulaştığında, durdurmayı başabaş noktasına taşırız (pozisyonun zararı durdurmayı açılış fiyatına taşırız).
5/ İlk aktivasyondan sonraki ikinci sıra, SİLMEYİN!
6/ Hafta sonunda kar/zararına bakmaksızın tüm emirleri silip/kapatın.

Yardım için teşekkürler:)

Danışman koduyla birlikte dosyayı ekliyorum

Dosyalar:
 
ivan-baaton :


Arkadaşlar MQL4 öğreniyorum ve Lazy Trader sistemi için Expert Advisor yazmaya karar verdim.
Expert Advisor yazıldı ama düzgün çalışmıyor. Gördüğüm hata, siparişlerin zamana göre kapanmamasıdır. Belki başka hatalar da vardır.


Lütfen hataları bulmaya yardımcı olun ve gördüğünüz kod hakkında geri bildirimde bulunun.

İşte Expert Advisor yazdığım sistemin kuralları:

1/ Haftanın başında ilk dört saatlik mumun kapanmasını bekliyoruz.
2/ Bekleyen Alış Durdurma ve Satış Durdurma emirlerini bu mumun Yüksek'in 20 pip üzerinde ve Düşük'ün 20 pip altında yerleştirin.
3/ Zararı durdur, karşıt emir seviyesinde yer alır. Kar al ayarlanmadı.
4/ Emir, zararı durdurmaya eşit bir kara ulaştığında, durdurmayı başabaş noktasına taşırız (pozisyonun zararı durdurmayı açılış fiyatına taşırız).
5/ İlk aktivasyondan sonraki ikinci sıra, SİLMEYİN!
6/ Hafta sonunda, kâr/zararına bakılmaksızın tüm siparişleri silin/kapatın.

Yardım için teşekkürler:)

Danışman koduyla birlikte dosyayı ekliyorum

 TimeHour ( TimeCurrent ()) == DayTimeClose

Bu tür mutlak eşitlik son derece nadir olabilir ve hafta 23'te kapanırsa, siparişleri biraz daha erken, en az 15 dakika kapatmak daha iyidir. Başka hata aramadım. İlk bakışta oldukça düzgün yazılmış.

 
Alexey Viktorov :

Bu tür mutlak eşitlik son derece nadir olabilir ve hafta 23'te kapanırsa, siparişleri biraz daha erken, en az 15 dakika kapatmak daha iyidir. Başka hata aramadım. İlk bakışta oldukça düzgün yazılmış.

Haftanın kapanışı - 00:00'da, yani siparişleri 1 saat önce kapatıyorum.


Bu kodda yanlış olan nedir: TimeHour ( TimeCurrent ()) == DayTimeClose ?


Bana öyle geliyor ki hata bu kodda bir yerde:


for (int i = OrdersTotal(); i>=0; i--)
{
if (OrderSelect(k, SELECT_BY_POS, MODE_TRADES) == true && TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5 && (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) && OrderMagicNumber( ) == Büyü)
{
ticket_sell = OrderClose(ticket_sell, Lot, Bid, 3, Red);
if (ticket_sell == yanlış)
Print(" Satış emri kapanmadı");
}

}


teşekkürler

 
ivan-baaton :

Haftanın kapanışı - 00:00'da, yani siparişleri 1 saat önce kapatıyorum.


Bu kodda yanlış olan nedir: TimeHour ( TimeCurrent ()) == DayTimeClose ?


Bana öyle geliyor ki hata bu kodda bir yerde:


for ( int i = OrdersTotal(); i>=0; i--)
{
if (OrderSelect( k , SELECT_BY_POS, MODE_TRADES) == true && TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5 && (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) && OrderMagicNumber( ) == Büyü)
{
ticket_sell = OrderClose(ticket_sell, Lot, Bid, 3, Red);
if (ticket_sell == yanlış)
Print(" Satış emri kapanmadı");
}

}


teşekkürler

Bu tam olarak gösterdiğim şey. Gerçi şimdi dikkatsiz olduğumu görüyorum. Yalnızca vurgulanan TimeHour( TimeCurrent() ) == DayTimeClose öğesini gördüm.

Ve işte döngü sayacı i ve k sırası seçili, bunu hemen görmedim.

 
Alexey Viktorov :

Bu tam olarak gösterdiğim şey. Gerçi şimdi dikkatsiz olduğumu görüyorum. Yalnızca vurgulanan TimeHour( TimeCurrent() ) == DayTimeClose öğesini gördüm.

Ve işte döngü sayacı i ve k sırası seçili, bunu hemen görmedim.


Evet, bu K ayrıca üst başlıktaki harici değişkenlerde de gösteriliyor, belki bu bir fonksiyonun dönüş değeridir ...


Alexey, sorunum hakkında ne söyleyebilirsin? Durdurma iptali emirlerine bağlanmaya çalışırken izleniyor. Bununla tanıştınız mı?