Danışmanı test cihazında çalıştırırsanız, ilk dört giriş yorumlarda görünür, test cihazı düşük hızdaysa ve bir duraklama kullanılıyorsa, her şey açıktır.
Kod dosyasını ekliyorum.
İlk koşulla çağrılmaya gitti ve bu koşula karşılık gelen pozisyonlara atama N_Caste = 1;
Yukarıdaki mesajların geliştirilmesinde danışmana iki boyutlu bir dizi oluşturmayı, pozisyonlar açıldıkça her pozisyon için bilet ve rank değerlerini girmeyi öğrettim.
Gelecekte, sinyallerin alınması veya koşulların oluşması üzerine, karşılık gelen pozisyonların sıraları değişecektir. Pozisyonları bu şekilde yönetmeyi planlıyorum.
Bir sorun var - profesyonellerden yanıt vermelerini istiyorum. Bir diziden öğelerin kaldırılmasıyla ilgili yardım.
Pozisyonlar kapalı olduğundan, dizi, bileti ve "ölü" zaten kapalı pozisyonun sıralamasını saklayan öğeleri biriktirir, nasıl silineceğini bilmiyorum.
172-173. sayfalardaki işlem çalışmıyor
if (dead_pos) ArrayRemove (Arr_Position,e, 2 );
ArrayResize (Arr_Position,All_Position);
OnTick()'te, her mum üzerinde pozisyonlar açılır, durakları değiştirilir, biletleri bir diziye girilir ve ilk sıfır sırası atanır.
Duraklar tetiklendiğinde, dizide fazladan öğeler birikir. Anlaşılır olması için gerekli yorumları çıkardım ve her şey çevrimiçi olarak görülebilir.
Kod hala küçük, bu yüzden buraya göndereceğim ve dosyayı da ekleyeceğim.
Bir dizinin temizliğini organize etmek için pliz'e yardım edin.
//+------------------------------------------------------------------+//| Sower_1_6 |//| Sergei Voicehovskii |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Sergei Voicehovskii"#property link"https://www.mql5.com"#property version"1.00"//---#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\HistoryOrderInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\TerminalInfo.mqh>
#include <Trade\Trade.mqh>
#include <Arrays\ArrayInt.mqh>
//---
CAccountInfo m_account;
CDealInfo m_deal;
CHistoryOrderInfo m_history;
COrderInfo m_order;
CPositionInfo m_position;
CSymbolInfo m_symbol;
CTerminalInfo m_terminal;
CTrade m_trade;
CArrayInt m_array;
//---#define observations 2int Arr_Position[][observations];
int Array_Change[];
//--- input parametersinputint SL = 50 ;
inputint TP = 50 ;
inputdouble Lot = 0.01 ;
inputdouble InpCloseProfit_money = 5.0 ;
inputdouble InpCloseProfit_points = 50.0 ;
inputdouble InpCloseProfit_percent = 3.0 ;
inputulong InpDeviation = 10 ;
inputbool InpPrintLog = true ;
inputbool InpCommentLog = true ;
inputulong Magic = 557755 ;
//---int stoploss = SL;
int takeprofit = TP;
ulong slippage = InpDeviation;
datetime Time_OpenPos;
//+------------------------------------------------------------------+intOnInit ()
{
//--- Обновляем данные
Refresh_Rates();
//--- Устанавливаем символ
m_symbol.Name( _Symbol );
//--- Устанавливаем Magic
m_trade.SetExpertMagicNumber(Magic);
//--- Определяем режим расчета маржи
m_trade.SetMarginMode();
//--- Определяем режим исполнения ордеров
m_trade.SetTypeFillingBySymbol(m_symbol.Name());
//--- Устанавливаем максимальное отклонение от запрашиваемой цены
m_trade.SetDeviationInPoints(slippage);
//---ArrayFree (Arr_Position);
//---//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
//--- destroy timerEventKillTimer ();
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick ()
{
if (Checking_NewBar())
{
//+---Открываем начальные позиции "свежего" бара
m_trade.Buy( 0.01 );
m_trade.Sell( 0.01 );
//+---Выставляем стопы начальных позиций
ModifySLTP_1_range(stoploss,takeprofit,Magic);
//+---Заполняем массив c тикет/кастой позиций int N = Array_Creating_Caste_Positions();
//+--- int R = ArrayRange (Arr_Position, 0 )- 1 ;
if (R< 30 )R= 0 ; else R= 30 ;
int tic = Arr_Position[R][ 0 ];
if (m_position.SelectByTicket(tic))
Time_OpenPos = m_position.Time();
int P = PositionsTotal ();
if (InpCommentLog){
Comment ( "Выводим данные \n""ticket: " ,tic, "\n""Время открытия позиции: " ,Time_OpenPos, "\n""Сколько элементов в массиве: " ,R+ 1 , "\n""Проверок тикета за проход: " ,N, "\n""Ввсего открыто позиций: " ,P, "\n"//"Время жизни позиции (стр): ",structura_time.year," год. ",structura_time.mon," мес. ",structura_time.day," дн. ",structura_time.hour," час. ",structura_time.min," мин. ",structura_time.sec," сек. \n"
);}
//---ArrayPrint (Arr_Position);
//---
}
//---
}
//+------------------------------------------------------------------+int Array_Creating_Caste_Positions()
{
int n = 0 ;
long ticket = 0 ;
bool new_pos = true ;
//---Запись новых тикетов в массив позиций int All_Position = PositionsTotal ();
int Array_Size = ArrayRange (Arr_Position, 0 );
//--- for ( int i = 0 ; i < All_Position; i++)
{
if (m_position.SelectByIndex(i))
{
ticket = PositionGetInteger ( POSITION_TICKET );
new_pos = true ;
}
for ( int e = 0 ; e < Array_Size; e++)
{
if (Arr_Position[e][ 0 ]==ticket)
{
new_pos = false ;
n++;
break ;
}
}
if (new_pos){
int New_Size = Array_Size+ 1 ;
ArrayResize (Arr_Position,New_Size, 0 );
Arr_Position[Array_Size][ 0 ] = ( int )ticket; //Ticket
Arr_Position[Array_Size][ 1 ] = 0 ; //Number_Caste (0 = начальные позиции)
n++;}
}
//---Удаление из массива мёртвых тикетов
Array_Size = ArrayRange (Arr_Position, 0 );
All_Position = PositionsTotal ();
//--- for ( int e = 0 ; e < Array_Size; e++)
{
int tickt = Arr_Position[e][ 0 ];
bool dead_pos = true ;
for ( int i = 0 ; i < All_Position; i++)
{
if (m_position.SelectByIndex(i))
{
if (tickt == PositionGetInteger ( POSITION_TICKET ))
{
dead_pos = false ;
n++;
break ;
}
}
}
if (dead_pos) ArrayRemove (Arr_Position,e, 2 );
ArrayResize (Arr_Position,All_Position);
}
//--- return (n);
}
//+------------------------------------------------------------------+//Проверка на наличие нового бара//+------------------------------------------------------------------+bool Checking_NewBar()
{
//--- переменная для возврата функцииbool new_bar_opened = false ;
//--- статическая переменная для хранения времени открытия последнего бара staticdatetime last_bar_time= 0 ;
//--- если статическая переменная еще неинициализирована if (last_bar_time== 0 )
{
//--- это первый вызов, запишем время открытия и выйдем
last_bar_time=( datetime ) SeriesInfoInteger ( _Symbol , Period (), SERIES_LASTBAR_DATE );
if (InpPrintLog)
PrintFormat ( "Инициализировали переменную last_bar_time значением %s" , TimeToString (last_bar_time));
}
//--- получим время открытия последнего бара по своему символу datetime curr_time=( datetime ) SeriesInfoInteger ( Symbol (), Period (), SERIES_LASTBAR_DATE );
//--- если время открытия текущего бара не совпадает с тем, что хранится в last_bar_time то открылся новый барif (curr_time!=last_bar_time)
{
new_bar_opened = true ;
//--- запомним время открытия нового бара в статической переменной
last_bar_time=curr_time;
//--- выведем сообщение об этом событии if (InpPrintLog)
PrintFormat ( "На символе %s открылся новый бар в %s" , _Symbol , TimeToString ( TimeCurrent ()));
}
return (new_bar_opened);
}
//+------------------------------------------------------------------+//Обновление котировок//+------------------------------------------------------------------+bool Refresh_Rates()
{
//--- refresh ratesif (!m_symbol.RefreshRates())
{
if (InpPrintLog)
Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "RefreshRates error" );
return ( false );
}
//--- protection against the return value of "zero"if (m_symbol.Ask()== 0 || m_symbol.Bid()== 0 )
{
if (InpPrintLog)
Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "Ask == 0.0 OR Bid == 0.0" );
return ( false );
}
//---return ( true );
}
//+------------------------------------------------------------------+void ModifySLTP_1_range( int stplss,
int tkprfit,
ulong mgc)
{
double sl = 0.0 ,
tp = 0.0 ;
double slbuy = 0.0 ,
slsell = 0.0 ,
tpbuy = 0.0 ,
tpsell = 0.0 ;
Refresh_Rates();
if (stplss> 0 )
{
slbuy = m_symbol.Bid() - stplss*m_symbol. Point ();
slsell = m_symbol.Ask() + stplss*m_symbol. Point ();
}
if (tkprfit> 0 )
{
tpbuy = m_symbol.Bid() + tkprfit*m_symbol. Point ();
tpsell = m_symbol.Ask() - tkprfit*m_symbol. Point ();
}
for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--)
{
if (m_position.SelectByIndex(i))
{
if (m_position. Symbol ()== Symbol ())
{
if (m_position.Magic() == mgc)
{
if (m_position.PositionType()== POSITION_TYPE_BUY )
{
sl = m_position.StopLoss() > 0 ? m_position.StopLoss() : slbuy;
tp = m_position.TakeProfit() > 0 ? m_position.TakeProfit() : tpbuy;
m_trade.PositionModify(m_position.Ticket(), NormalizeDouble (sl, Digits ()), NormalizeDouble (tp, Digits ()));
}
if (m_position.PositionType()== POSITION_TYPE_SELL )
{
sl = m_position.StopLoss() > 0 ? m_position.StopLoss() : slsell;
tp = m_position.TakeProfit() > 0 ? m_position.TakeProfit() : tpsell;
m_trade.PositionModify(m_position.Ticket(), NormalizeDouble (sl, Digits ()), NormalizeDouble (tp, Digits ()));
}
}
}
}
}
}
//+------------------------------------------------------------------+
StLoss sürecinin netliği için, 0'ı ayarlamak, TProf'u 50 bırakmak, danışmanı herhangi bir para biriminin saatlik grafiğine atmak daha iyidir. Test cihazında.
Çevrimiçi bir demoda, elbette, bir dakika daha iyidir
StLoss sürecinin netliği için, 0'ı ayarlamak, TProf'u 50 bırakmak, danışmanı herhangi bir para biriminin saatlik grafiğine atmak daha iyidir. Test cihazında.
Çevrimiçi bir demoda, elbette, bir dakika daha iyidir
При успешном выполнении функция возвращает количество всех элементов, содержащихся в массиве после изменения размера; в противном случае возвращает -1 и массив не меняет размеры. Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в...
Ve daha da iyisi, artık gerekmeyen öğeleri iki boyutlu bir diziden nasıl çıkaracağınızı biliyorsanız söyleyin ???
Kafamı kırdım, referans kitabı deliklere sıkışmıştı. Beyinlerin yeterli olmaması üzücü.
Bir diziyi "kendi içine" kopyalamak , silinmekte olanın yanındaki pozisyondan başlamak ve silinmekte olandan başlayarak yazmak. Ardından Grigori.SB tarafından önerilen şekilde yeniden boyutlandırın
int src_data[ 10 ];
//--- Не важно как заполнен массив//--- Удалим индекс 4ArrayCopy (src_data, src_data, 4 , 5 );
ArrayResize (src_data, ArraySize (src_data)- 1 );
İki boyutlu bir dizi için, silinecek satır numarasını 2 ile çarpmanız gerekir. 3 boyutlu bir dizi için, 3 ile ...
Muhtemelen dikkat etmediniz, yukarıda gördüğünüz gibi, MQL5 ile ilgili tüm sorular.
Farkın bazen temel olmadığını anlıyorum, ama yine de. Verdiğiniz işlev, bir dizinin boyutunu değiştirir, boyut küçülürse muhtemelen gereksiz öğeleri keser.
İhtiyaç duyulan şey bu değil. Öğeyi değerine göre bularak kaldırmanız gerekir. Evet ve bu işlevi kullanmaya çalıştım, #23'te bunun hakkında yazdım. Her durumda - teşekkürler.
Yaşasın, kabul edilebilir bir sonuç elde etmiş görünüyor.
Pozisyonlar açıldıkça dizi gerekli verilerle doldurulur.
Danışmanı test cihazında çalıştırırsanız, ilk dört giriş yorumlarda görünür, test cihazı düşük hızdaysa ve bir duraklama kullanılıyorsa, her şey açıktır.
Kod dosyasını ekliyorum.
İlk koşulla çağrılmaya gitti ve bu koşula karşılık gelen pozisyonlara atama N_Caste = 1;
Eleştiri açığız.
Tüm nazik insanlara teşekkürler.
... Bu tür şeyler ya bağımsız olarak yazılır ya da serbest olarak sipariş edilir.
Üzgünüm, geçemedim. Olmayan şeyler var mı?
İyi geceler.
Yukarıdaki mesajların geliştirilmesinde danışmana iki boyutlu bir dizi oluşturmayı, pozisyonlar açıldıkça her pozisyon için bilet ve rank değerlerini girmeyi öğrettim.
Gelecekte, sinyallerin alınması veya koşulların oluşması üzerine, karşılık gelen pozisyonların sıraları değişecektir. Pozisyonları bu şekilde yönetmeyi planlıyorum.
Bir sorun var - profesyonellerden yanıt vermelerini istiyorum. Bir diziden öğelerin kaldırılmasıyla ilgili yardım.
Pozisyonlar kapalı olduğundan, dizi, bileti ve "ölü" zaten kapalı pozisyonun sıralamasını saklayan öğeleri biriktirir, nasıl silineceğini bilmiyorum.
172-173. sayfalardaki işlem çalışmıyor
OnTick()'te, her mum üzerinde pozisyonlar açılır, durakları değiştirilir, biletleri bir diziye girilir ve ilk sıfır sırası atanır.
Duraklar tetiklendiğinde, dizide fazladan öğeler birikir. Anlaşılır olması için gerekli yorumları çıkardım ve her şey çevrimiçi olarak görülebilir.
Kod hala küçük, bu yüzden buraya göndereceğim ve dosyayı da ekleyeceğim.
Bir dizinin temizliğini organize etmek için pliz'e yardım edin.
StLoss sürecinin netliği için, 0'ı ayarlamak, TProf'u 50 bırakmak, danışmanı herhangi bir para biriminin saatlik grafiğine atmak daha iyidir. Test cihazında.
Çevrimiçi bir demoda, elbette, bir dakika daha iyidir
StLoss sürecinin netliği için, 0'ı ayarlamak, TProf'u 50 bırakmak, danışmanı herhangi bir para biriminin saatlik grafiğine atmak daha iyidir. Test cihazında.
Çevrimiçi bir demoda, elbette, bir dakika daha iyidir
St.Loss † © Duvarınıza !
sandalyeden düştüm)
St.Loss'un kaçınılmaz olduğu görülebilir.
Hmm .. bu konuyla ilgili biri var, peki †, zaten forumda var ..)
St.Loss † © Duvarınıza !
sandalyeden düştüm)
St.Loss'un kaçınılmaz olduğu görülebilir.
Hmm .. bu konuyla ilgili biri var, peki †, zaten forumda var ..)
Kabul ediyorum, kulağa komik geliyor. Ama bu sadece algoritmanın bir parçası olan bir model. Ruh halinizi iyileştirebildiğime sevindim.
Zorlaştırmıyorsa, ".... bu konuyla ilgili biri var, peki †, forumda zaten var .." linkini atın pliz.
Zorlaştırmıyorsa, ".... bu konuyla ilgili biri var, peki †, forumda zaten var .." linkini atın pliz.
Ve daha da iyisi, artık gerekmeyen öğeleri iki boyutlu bir diziden nasıl çıkaracağınızı biliyorsanız söyleyin ???
Kafamı kırdım, referans kitabı deliklere sıkışmıştı. Beyinlerin yeterli olmaması üzücü.
artık gerekmeyen iki boyutlu bir diziden öğeler nasıl kaldırılır ???
ArrayResize() ;
Ve daha da iyisi, artık gerekmeyen öğeleri iki boyutlu bir diziden nasıl çıkaracağınızı biliyorsanız söyleyin ???
Kafamı kırdım, referans kitabı deliklere sıkışmıştı. Beyinlerin yeterli olmaması üzücü.
Bir diziyi "kendi içine" kopyalamak , silinmekte olanın yanındaki pozisyondan başlamak ve silinmekte olandan başlayarak yazmak. Ardından Grigori.SB tarafından önerilen şekilde yeniden boyutlandırın
İki boyutlu bir dizi için, silinecek satır numarasını 2 ile çarpmanız gerekir. 3 boyutlu bir dizi için, 3 ile ...ArrayResize() ;
Günaydın, cevabınız için teşekkürler.
Muhtemelen dikkat etmediniz, yukarıda gördüğünüz gibi, MQL5 ile ilgili tüm sorular.
Farkın bazen temel olmadığını anlıyorum, ama yine de. Verdiğiniz işlev, bir dizinin boyutunu değiştirir, boyut küçülürse muhtemelen gereksiz öğeleri keser.
İhtiyaç duyulan şey bu değil. Öğeyi değerine göre bularak kaldırmanız gerekir. Evet ve bu işlevi kullanmaya çalıştım, #23'te bunun hakkında yazdım. Her durumda - teşekkürler.