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

 

merhaba !

lütfen bakın nerede hata yaptım (çalışmak istemiyorum)

Bunu şu koşulda istiyorum: if (GetLotSize()>LotControl)- satın alma sinyali sapma * _Point parametresi (parametrelerde ayarlanmış) tarafından değiştirilir

LotControl - ayarlarda da ayarlanır

GetLotSize() - önerildiği gibi:

 double GetLotSize()
  {
   double Ls= 0 ;
   datetime last = 0 , openTime;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }
 void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
       if (CountOrders()== 0 )
 {

   if (GetLotSize()>LotControl)  {openPrice = dMA + deviation * _Point ;}
   
   else 
  openPrice = dMA;
   //Если появился сигнал на покупку, то откроем ордер на покупку
   if (bSignalBuy() == true )
   vOrderOpenBuy();
   
// Если появился сигнал на продажу, то откроем ордер на продажу
   if (bSignalSell() == true )
   vOrderOpenSell();
  
     }
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

 // if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
 //    {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
 //     CloseOrder();
 //    }
DrawLABEL( "lab_Take" , 1 , 5 , 0 ,Color(GetProfitFromStart()> 0 ,Lime,Red), StringConcatenate ( "Profit: " ,DoubleToStr(GetProfitFromStart(), 2 ),AC));
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt= 0 ;
   int i= OrdersTotal ()- 1 ;
   for ( int pos=i;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol()== _Symbol )
           {
             if (OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return (cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if (openPrice > Open[ 1 ] && openPrice < Close[ 1 ]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
   
   return ( true );
   
   return ( false );
  }
 
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
   
  {
   if (openPrice< Open[ 1 ] && openPrice > Close[ 1 ])

   return ( true );

   return ( false );
  }

 
законопослушный гражданин # :

Teşekkür ederim. nedense işe yaramadı.

 //+----------------------------------------------------------------------------+
if (bSignalBuy())
  {
   if (GetLotSize()>LotControl) vOrderOpenSell();
   else vOrderOpenBuy();
  }
//+----------------------------------------------------------------------------+
double GetLotSize()
  {
   double Ls= 0 ;
   datetime t= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
//+----------------------------------------------------------------------------+
 
законопослушный гражданин # :

Teşekkür ederim. nedense işe yaramadı.

Yazdım:

 if (bSignalBuy()) {
   if (GetLotSize() > LotControl)
    vOrderOpenSell();
   else
    vOrderOpenBuy();
}

Ama yine de aynı tik üzerinde iki zıt yönlü pozisyon açılıyor mu? Bu olamaz!

 double GetLotSize()
  {
   double Ls= 0 ;
   datetime last = 0 , openTime;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }

Bu kod pahasına, hiçbir şey değişmemiş olabilir. Çünkü siparişler kapanışta.

Algoritmanızı doğru anlayacaksınız.

 void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
       if (CountOrders()== 0 )
 {

   if (GetLotSize()>LotControl)  {openPrice = dMA + deviation * _Point ;}
   
   else 
  openPrice = dMA;
   //Если появился сигнал на покупку, то откроем ордер на покупку
   if (bSignalBuy() == true )
   vOrderOpenBuy();
   
// Если появился сигнал на продажу, то откроем ордер на продажу
   if (bSignalSell() == true )
   vOrderOpenSell();
  
     }
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

 // if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
 //    {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
 //     CloseOrder();
 //    }
DrawLABEL( "lab_Take" , 1 , 5 , 0 ,Color(GetProfitFromStart()> 0 ,Lime,Red), StringConcatenate ( "Profit: " ,DoubleToStr(GetProfitFromStart(), 2 ),AC));
  }

Burada, genel olarak, bir Al ve Sat sinyaline giriş ve daha fazlası değil. Burada işinize yaramayan ne olabilir?... Piyasanın giriş işlevleri değil, çıkış işlevleri değil...

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

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

MakarFX , 2021.12.02 18:30

 //+----------------------------------------------------------------------------+
if (bSignalBuy())
  {
   if (GetLotSize()>LotControl) vOrderOpenSell();
   else vOrderOpenBuy();
  }
//+----------------------------------------------------------------------------+
double GetLotSize()
  {
   double Ls= 0 ;
   datetime t= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
//+----------------------------------------------------------------------------+

Ve burada ne var? Gerçekten hiçbir şeyi değiştirmedin. Az önce OrderCloseTime'a daha fazla çağrı yaptım. Kod tek satırda çıkarıldı. Ve daha az okunabilir hale geldi. Ama sonuç aynı kalıyor.

 
Mihail Matkovskij # :

Ve burada ne var? Gerçekten hiçbir şeyi değiştirmedin. Az önce OrderCloseTime'a daha fazla çağrı yaptım. Ama sonuç aynı.

gözlerini aç
 
MakarFX # :
gözlerini aç

Stüdyodaki tartışmalar lütfen

 
Mihail Matkovskij # :

Stüdyodaki tartışmalar lütfen

Şimdi gözlerini aç

 
Mihail Matkovskij # :

Ve burada ne var? Gerçekten hiçbir şeyi değiştirmedin. Az önce OrderCloseTime'a daha fazla çağrı yaptım. Ve kod bir satırda çekildi. Ve daha az okunabilir hale geldi. Ama sonuç aynı kalıyor.

Görebildiğim kadarıyla, fark aşağıdaki gibidir:

 double GetLotSize()
  {
   double Ls= 0 ;
   datetime last = 0 , openTime;
   for ( int pos= OrdersTotal ( )- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }



double GetLotSize()
  {
   double Ls= 0 ;
   datetime t= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
мне как то объясняли, что один вариант считает с конца списка, а второй с начала.
 
MakarFX # :

Şimdi gözlerini aç

İyi. Bu anı özledim. İtiraf ederim.

 
законопослушный гражданин # :

Görebildiğim kadarıyla, fark aşağıdaki gibidir:

 double GetLotSize()
  {
   double Ls= 0 ;
   datetime last = 0 , openTime;
   for ( int pos= OrdersTotal ( )- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }




double GetLotSize()
  {
   double Ls= 0 ;
   datetime t= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }