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

 
Mihail Matkovskij # :

Öyle olmasa da. Performansı izleme ihtiyacı

veya OnTradeTransaction'daki yeni işleviniz. Ve pozisyon yoksa, girin. Veya buySignal veya sellSignal için bir sinyal yazın ve örnekte gösterdiğim gibi OnTimer'da işleyin.

ClosePosWithMaxProfitInCurrency

Bu özellik artık alakalı değil. O uymuyor. Yeri, varsa ilk açılan siparişi kapatacak bir işlevle değiştirilmelidir.

Global düzeyde kayıtlı buySignal ve sellSignal Değişkenlerini anlamayacağım . Ama derlerken verir

'sellSignal' - some operator expected   

expression has no effect        

'buySignal' - some operator expected    

expression has no effect        



 

Tünaydın.

Elbette bütün bunları okudum ve her siparişi ayrı ayrı boyayabilirim ama soru kodu kısaltmaktı.

 
İyi günler, meslektaşlarım! Lütfen yeni başlayanlara önceki çubuktan değil, göstergenin mevcut değerini (şu anda) nasıl alacağını söyleyin? Danışman yalnızca önceki çubuk bittiğinde çalışır, ancak daha önce ihtiyacım var.
 
makssub # :

Tünaydın.

Elbette bütün bunları okudum ve her siparişi ayrı ayrı boyayabilirim ama soru kodu kısaltmaktı.

Kod azaltmada tam olarak ne işe yaramaz?

 
Shockeir # :
İyi günler meslektaşlarım! Lütfen yeni başlayanlara önceki çubuktan değil, göstergenin mevcut değerini (şu anda) nasıl alacağını söyleyin? Danışman yalnızca önceki çubuk bittiğinde çalışır, ancak daha önce ihtiyacım var.

Belki de durumun daha ayrıntılı bir açıklaması ve sizin başarılı olamadığınız gerçeği daha iyi bir sonuç verecektir.

 
Andrey Sokolov # :

Belki de durumun daha ayrıntılı bir açıklaması ve sizin başarılı olamadığınız gerçeği daha iyi bir sonuç verecektir.

Standart Stokastik gösterge. EA, K ve D çizgilerinin kesiştiği noktada tetiklenmelidir. Tam kesişme noktasında, yeni bir çubuk görünene kadar hiçbir şey olmaz. Yeni bir çubuk göründüğünde, koşul hala karşılanıyorsa, bir eylem gerçekleşir. Anladığım kadarıyla bunun nedeni, gösterge arabelleklerindeki son değerin en son tamamlanan çubukta hesaplanmasıdır. Bu nedenle, tetiklemenin henüz tamamlanmamış bir çubukta gerçekleşmesini istiyorum.

 
Shockeir # :

Standart Stokastik gösterge. EA, K ve D çizgilerinin kesiştiği noktada tetiklenmelidir. Tam kesişme noktasında, yeni bir çubuk görünene kadar hiçbir şey olmaz. Yeni bir çubuk göründüğünde, koşul hala karşılanıyorsa, bir eylem gerçekleşir. Anladığım kadarıyla bunun nedeni, gösterge arabelleklerindeki son değerin en son tamamlanan çubukta hesaplanmasıdır. Bu nedenle, tetiklemenin henüz tamamlanmamış bir çubukta gerçekleşmesini istiyorum.

Son mumun indeksi 0'dır.

Ve nasıl çözmeye çalıştı? Yardımı okudun mu? Tam olarak ne çalışmıyor?

 
Andrey Sokolov # :

Kodu yapıştırabilir misin? Böylece en azından hangi dilde yaptığınız açıktı.

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"

//--- input parameters
input double    crossDepthOpen= 7 ;     //Глубина пересечения K и D для открытия
input double    crossDepthClose=- 2 ;   //Глубина пересечения K и D для закрытия
input double    closeCoef= 5 ;         //Коэффициент изменения глубины закрытия
input int       k_period= 8 ;           //Период K
input int       d_period= 3 ;           //Период В
input int       slowing= 3 ;           //Сглаживание
input double    tp_1= 20 ;             //Тейк
input double    sl_1= 60 ;             //Лосс
input double    maxPos= 2.0 ;           //Размер лота

int       stoch_handle;
double    k_buffer[ 1 ];
double    d_buffer[ 1 ];
double    TKP;
double    STL;
double    CDO;
double    CDC;
int       lossCount= 0 ;
int       profitCount= 0 ;
int       EA_magic= 12345 ;


//| Expert initialization function

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
   TKP=tp_1;
   STL=sl_1;

   stoch_handle= iStochastic ( _Symbol , PERIOD_CURRENT ,k_period,d_period,slowing, MODE_EMA , STO_LOWHIGH );
   if (stoch_handle< 0 )
     {
       Alert ( "Ошибка при создании индикаторов " , GetLastError ());
       return ( 0 );
     }
   return ( INIT_SUCCEEDED );
  }

//| Expert tick function

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
   CDO=crossDepthOpen;
   CDC=crossDepthClose;
   MqlTick latestPrice;
   MqlTradeResult mResult;
   MqlTradeRequest mRequest;
   ZeroMemory (mRequest);
   SymbolInfoTick ( _Symbol ,latestPrice);
   ArraySetAsSeries (k_buffer, true );
   ArraySetAsSeries (d_buffer, true );
   if ( CopyBuffer (stoch_handle, 0 , 0 , 1 ,k_buffer)< 0 )
     {
       Alert ( "Не удалось скопировать в буфер K" , GetLastError ());
       return ;
     }
   if ( CopyBuffer (stoch_handle, 1 , 0 , 1 ,d_buffer)< 0 )
     {
       Alert ( "Не удалось скопировать в буфер D" , GetLastError ());
       return ;
     }

   bool buyFullOpened= false ;
   bool buyPartOpened= false ;
   bool sellFullOpened= false ;
   bool sellPartOpened= false ;

//Состояние позиций
   if ( PositionSelect ( _Symbol )== true )
     {
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
        {
         if ( PositionGetDouble ( POSITION_VOLUME )>=maxPos)
           {
            buyFullOpened= true ;
           }
         else
           {
            buyPartOpened= true ;
           }
        }
       else
         if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
           {

             if ( PositionGetDouble ( POSITION_VOLUME )>=maxPos)
              {
               sellFullOpened= true ;
              }
             else
              {
               sellPartOpened= true ;
              }
           }
     }
//состояние позиций конец

//Условия изменения позиций
   bool buyOpenCondition=k_buffer[ 0 ]>((d_buffer[ 0 ])+CDO);
   bool buyCloseCondition=k_buffer[ 0 ]<((d_buffer[ 0 ])-CDC);
   bool buyTPCondition=latestPrice.bid>( PositionGetDouble ( POSITION_PRICE_OPEN )+TKP* _Point );
   bool buySLCondition=latestPrice.bid<( PositionGetDouble ( POSITION_PRICE_OPEN )-STL* _Point );
   bool sellOpenCondition=k_buffer[ 0 ]<((d_buffer[ 0 ])-CDO);
   bool sellCloseCondition=k_buffer[ 0 ]>((d_buffer[ 0 ])+CDC);
   bool sellTPCondition=latestPrice.ask<( PositionGetDouble ( POSITION_PRICE_OPEN )-TKP* _Point );
   bool sellSLCondition=latestPrice.ask>( PositionGetDouble ( POSITION_PRICE_OPEN )+STL* _Point );
//Условия изменения позиций конец

//Проверка и выполнение действий
   if (buyOpenCondition)
     {
       if (!buyFullOpened && !buyPartOpened && !sellPartOpened && !sellFullOpened)
        {
         Print ( "Покупка по сигналу" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.ask, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.ask - STL*Point(),_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = maxPos;
         OrderSend (mRequest,mResult);
         Print ( "Открыто " , PositionGetDouble ( POSITION_VOLUME ), " по " , PositionGetDouble ( POSITION_PRICE_OPEN ));
        }
     }
//Условия покупки
   if (sellTPCondition)
     {
       if (sellFullOpened)
        {
         Print ( "Тейк-профит шорта" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.ask, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = MathRound ( PositionGetDouble ( POSITION_VOLUME )/ 2 );
         OrderSend (mRequest,mResult);
         ++profitCount;
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }

   if (sellSLCondition)
     {
       if (sellFullOpened || sellPartOpened)
        {
         Print ( "Стоп-лосс шорта" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.ask, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = PositionGetDouble ( POSITION_VOLUME );
         OrderSend (mRequest,mResult);
         ++lossCount;
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }

   if (sellCloseCondition)
     {
       if (sellFullOpened || sellPartOpened)
        {
         Print ( "Закрытие шорта по сигналу" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         Print (k_buffer[ 0 ], " " ,d_buffer[ 0 ]);
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.ask, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = PositionGetDouble ( POSITION_VOLUME );
         OrderSend (mRequest,mResult);
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }

//Условия продажи
   if (sellOpenCondition)
     {
       if (!sellFullOpened && !buyPartOpened && !sellPartOpened && !buyFullOpened)
        {
         Print ( "Продажа по сигналу" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         Print (k_buffer[ 0 ], " " ,d_buffer[ 0 ]);
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.bid, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = maxPos;
         OrderSend (mRequest,mResult);
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }
   if (buyTPCondition)
     {
       if (buyFullOpened)
        {
         Print ( "Тейк-профит лонга" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.bid, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = MathRound ( PositionGetDouble ( POSITION_VOLUME )/ 2 );
         OrderSend (mRequest,mResult);
         ++profitCount;
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }

   if (buySLCondition)
     {
       if (buyFullOpened || buyPartOpened)
        {
         Print ( "Стоп-лосс лонга" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         Print (k_buffer[ 0 ], " " ,d_buffer[ 0 ]);
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.bid, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = PositionGetDouble ( POSITION_VOLUME );
         OrderSend (mRequest,mResult);
         ++lossCount;
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }

   if (buyCloseCondition)
     {
       if (buyFullOpened || buyPartOpened)
        {
         Print ( "Закрытие лонга по сигналу" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         Print (k_buffer[ 0 ], " " ,d_buffer[ 0 ]);
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.bid, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = PositionGetDouble ( POSITION_VOLUME );
         OrderSend (mRequest,mResult);
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade ()
  {
//---

  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   IndicatorRelease (stoch_handle);
   Print ( "loss " ,lossCount);
   Print ( "profit " ,profitCount);
  }
//+------------------------------------------------------------------+
Andrey Sokolov

Kodu yapıştırabilir misin? Böylece en azından hangi dilde yaptığınız açıktı.

 

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

GlaVredFX , 2022.01.17 22:52

ClosePosWithMaxProfitInCurrency

Bu özellik artık alakalı değil. O uymuyor. Yeri, varsa ilk açılan siparişi kapatacak bir işlevle değiştirilmelidir.

Global düzeyde kayıtlı buySignal ve sellSignal Değişkenlerini anlamayacağım . Ama derlerken verir

'sellSignal' - some operator expected   

expression has no effect        

'buySignal' - some operator expected    

expression has no effect        



Kayıtlı olarak ve derleyici nerede yemin ediyor? tahmin edemiyorum. Anlamak için kaynak koduna ihtiyacınız var.
 
Shockeir # :
İyi günler, meslektaşlarım! Lütfen yeni başlayanlara , önceki çubuktan değil, göstergenin mevcut değerini (şu anda) nasıl alacağını söyleyin? Danışman yalnızca önceki çubuk bittiğinde çalışır, ancak daha önce ihtiyacım var.

k_buffer[0] ve d_buffer[0] dizileri, göstergenin son değerlerini içerir. Onları dışarı çıkarmanın ve kendin görmenin sorunu nedir?