SGarnov : Derlemeyen bir şey eklemeye çalıştım. Tüm kodları ifşa ediyorum, ihtiyaç olursa derleme ekranını ifşa edeceğim. Ayrıca bir sorun olabileceğini düşünüyorum, almam katsayı (dış değişken) üzerinden durma ile ilgili olarak ayarlandı, manuel bir ayara değiştirilebilir mi ve danışmanın eklemesi daha kolay olur mu?
İşlev
double GetPointLastLoss(){
datetime t= 0 ;
double result= 0 ,p= 0 ,tp= 0 ;
int i=OrdersHistoryTotal(),magic= 0 ;
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(); p=OrderProfit(); tp=OrderType();
if (tp==OP_BUY&&p< 0 )
{
result=OrderOpenPrice()-OrderClosePrice();
} else {result= 0 ;}
if (tp==OP_SELL&&p< 0 )
{
result=OrderClosePrice()-OrderOpenPrice();
} else {result= 0 ;}
}
}
}
}
}
return (result);
}
global kapsamdan çıkarın. magic=0 derleme için takıldı.
global kapsamdan çıkarın. magic=0 derleme için takıldı.
Kaldırıldı, derleme hatası yok, tp=0 sütunundaki işlevin üçüncü satırında harici değişken int tp=0 referans alınarak yalnızca 1 uyarı çıkıyor. Neyi sevmediğini tam olarak anlamıyorum. Tüm kodu ekliyorum, düzeltmek zor değilse, gerçek yakınlarda bir yerdedir.
Kaldırıldı, derleme hatası yok, tp=0 sütunundaki işlevin üçüncü satırında harici değişken int tp=0 referans alınarak yalnızca 1 uyarı çıkıyor. Neyi sevmediğini tam olarak anlamıyorum. Tüm kodu ekliyorum, düzeltmek zor değilse, gerçek yakınlarda bir yerdedir.
Bunun gibi
//+------------------------------------------------------------------+//| SGarnov.v2.mq4 |//| Copyright 2020, DrMak. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, DrMak."#property link" https://www.mql5.com "#property version"1.00"#property strict//--- input parametersinputint T_Profit = 2 ; // Коэффициент Take Profitinputint S_Loss = 100 ; // Уровень Stop Lossinputdouble O_Lots = 0.01 ; //Лотыinputint Input4;
inputint Input5;
inputint Input6;
double sl_price,tp_price,t_profit,s_loss;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//---//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick ()
{
//---
t_profit = S_Loss*T_Profit;
s_loss = MathMax (S_Loss, MarketInfo( Symbol (), MODE_STOPLEVEL));
// Проверяем наличие ордеров BUYif (CountOrders( _Symbol , 0 )> 0 )
{
// Проверяем последний закрытый ордер SELL на наличие убытка в пунктахif (GetPointLastLoss( 1 )> 0 )
{
// Если убыток есть, то добавляем пункты убытка
sl_price = NormalizeDouble ( Point () * s_loss, Digits );
tp_price = NormalizeDouble (GetPointLastLoss( 1 )+ Point () * t_profit, Digits );
ModifyOrder( _Symbol , sl_price, tp_price);
}
else
{
// Если убытка нет
sl_price = NormalizeDouble ( Point () * s_loss, Digits );
tp_price = NormalizeDouble ( Point () * t_profit, Digits );
ModifyOrder( _Symbol , sl_price, tp_price);
}
}
// Проверяем наличие ордеров SELLif (CountOrders( _Symbol , 1 )> 0 )
{
// Проверяем последний закрытый ордер BUY на наличие убытка в пунктахif (GetPointLastLoss( 0 )> 0 )
{
// Если убыток есть, то добавляем пункты убытка
sl_price = NormalizeDouble ( Point () * s_loss, Digits );
tp_price = NormalizeDouble (GetPointLastLoss( 0 )+ Point () * t_profit, Digits );
ModifyOrder( _Symbol , sl_price, tp_price);
}
else
{
// Если убытка нет
sl_price = NormalizeDouble ( Point () * s_loss, Digits );
tp_price = NormalizeDouble ( Point () * t_profit, Digits );
ModifyOrder( _Symbol , sl_price, tp_price);
}
}
}
//+--------------------------------------------------------------------------------------------------------------------+//| Подсчет ордеров по типу |//+--------------------------------------------------------------------------------------------------------------------+//| 0 - ордера типа BUY 1 - ордера типа SELL |//| 2 - ордера типа BUYLIMIT 3 - ордера типа SELLLIMIT |//| 4 - ордера типа BUYSTOP 5 - ордера типа SELLSTOP |//| 6 - ордера типа Balance -1 - Все типы ордеров |//+--------------------------------------------------------------------------------------------------------------------+int CountOrders( string symb= "" , int or_ty=- 1 )
{
int cnt= 0 ;
if (symb== "0" ) symb= _Symbol ;
for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
{
if ( OrderSelect (pos,SELECT_BY_POS)== true )
{
if (OrderSymbol()==symb || symb== "" )
{
if (or_ty< 0 || or_ty==OrderType()) cnt++;
}
}
}
return (cnt);
}
//+----------------------------------------------------------------------------+//| Модификация ордера |//+----------------------------------------------------------------------------+//| sl - ценовой уровень стопа |//| tp - ценовой уровень тейка |//+----------------------------------------------------------------------------+void ModifyOrder( string symb= "" , double sl= 0 , double tp= 0 )
{
if (symb== "0" ) symb= _Symbol ;
for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
{
if ( OrderSelect (pos,SELECT_BY_POS)== true )
{
if (OrderSymbol()==symb || symb== "" )
{
if (OrderStopLoss()== 0 )
{
if (OrderType()==OP_BUY)
{
if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-sl_price, OrderOpenPrice()+tp_price, OrderExpiration()))
{ Print ( "Ордер модифицирован" );}
else
{ Print ( "Ошибка модификации ордера:" , GetLastError ());}
}
if (OrderType()==OP_SELL)
{
if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+sl_price, OrderOpenPrice()-tp_price, OrderExpiration()))
{ Print ( "Ордер модифицирован" );}
else
{ Print ( "Ошибка модификации ордера:" , GetLastError ());}
}
}
}
}
}
}
//+----------------------------------------------------------------------------+//| Возвращает пункты убытка последнего закрытого ордера в пунктах |//| 0 - последний ордер BUY |//| 1 - последний ордер SELL |//+----------------------------------------------------------------------------+double GetPointLastLoss( int or_ty=- 1 )
{
datetime t= 0 ;
double result= 0 ,p= 0 ;
int i=OrdersHistoryTotal();
for ( int pos= 0 ; pos<i; pos++)
{
if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
{
if ((OrderSymbol()== _Symbol ))
{
if (OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if (t<OrderCloseTime())
{t=OrderCloseTime(); p=OrderProfit(); or_ty=OrderType();
if (or_ty==OP_BUY&&p< 0 )
{
result=OrderOpenPrice()-OrderClosePrice();
} else {result= 0 ;}
if (or_ty==OP_SELL&&p< 0 )
{
result=OrderClosePrice()-OrderOpenPrice();
} else {result= 0 ;}
}
}
}
}
}
return (result);
}
//+------------------------------------------------------------------+
zararı durdur seviyesinde satın almak için bekleyen bir emir.
Fiyat alıma ulaştı - danışman zararı durdur ve bekleyen satın alma emrini kaldırır.
Ve tam tersi, iş bekleyen bir satışla başlarsa.
Ve böylece danışman, "Zarar Durdurma Sayısı" harici parametresi üzerindeki çalışmasını durdurana kadar çalışır (benim durumumda 2'dir - bu, 2. seçeneğin 3 kez tekrarlanacağı ve danışmanın gelecekte çalışmayı durduracağı ve tümünü kaldıracağı anlamına gelir. bekleyen emirleri hesaba katarak ilk durak gitmez).
İkinci varyantta hedefe bir durak eklenir. alıma ulaşılmazsa ve 2. seçenek tekrarlanırsa, belirtilen harici parametre "Zararı Durdurma numarası"na bağlı olarak alıma 2 durak eklenir ve bu şekilde devam eder.
Gönderdiğim kod, tarif ettiğim sorun dışında olması gerektiği gibi çalışıyor (geçmişte almaya eklenmesi gereken 1 durak veya 2 durak görmüyor).
zararı durdur seviyesinde satın almak için bekleyen bir emir.
Fiyat alıma ulaştı - danışman zararı durdur ve bekleyen satın alma emrini kaldırır.
Ve tam tersi, iş bekleyen bir satışla başlarsa.
Ve böylece danışman, "Zarar Durdurma Sayısı" harici parametresi üzerindeki çalışmasını durdurana kadar çalışır (benim durumumda 2'dir - bu, 2. seçeneğin 3 kez tekrarlanacağı ve danışmanın gelecekte çalışmayı durduracağı ve tümünü kaldıracağı anlamına gelir. bekleyen emirleri hesaba katarak ilk durak gitmez).
İkinci varyantta hedefe bir durak eklenir. alıma ulaşılmazsa ve 2. seçenek tekrarlanırsa, belirtilen harici parametre "Zararı Durdurma numarası"na bağlı olarak alıma 2 durak eklenir ve bu şekilde devam eder.
Gönderdiğim kod, tarif ettiğim sorun dışında olması gerektiği gibi çalışıyor (geçmişte almaya eklenmesi gereken 1 durak veya 2 durak görmüyor).
Bunun gibi bir şey.
"Zarar Durdurma Sayısı" - art arda mı yoksa mevcut gün için mi?
"Zarar Durdurma Sayısı" - art arda mı yoksa mevcut gün için mi?
Bir döviz çifti için art arda durak sayısı.
Danışman birkaç döviz çifti üzerinde durur ve geçmişe birkaç durak girer ve farklı sıralarda, geçmişi anlamak için danışman başlangıçta emirleri ID'lerle işaretler ancak geçmişte bulamaz, OrderMagikNumber()'ın görüneceğini düşündüm. onlar için. Belki de farklı döviz çiftlerinden gelen stopların tarihinde, danışmanın onları "görmeyi" bırakması nedeniyle?Bir çift üzerinde danışman olarak çalışmaya çalışmadım ve o zaman bundan bir anlamı olmayacak.
kaynağı tekrar yaz? Düzeltmesi gereken tek şey, "tarihten stop işlemlerini aramak ve yeni yerleştirilen alıma eklemesini sağlamaktır".
Manuel olarak verilen siparişlere eşlik eden bir danışmanınız var mı?
Derlemeyen bir şey eklemeye çalıştım. Tüm kodları ifşa ediyorum, ihtiyaç olursa derleme ekranını ifşa edeceğim. Ayrıca bir sorun olabileceğini düşünüyorum, almam katsayı (dış değişken) üzerinden durma ile ilgili olarak ayarlandı, manuel bir ayara değiştirilebilir mi ve danışmanın eklemesi daha kolay olur mu?
İşlev
global kapsamdan çıkarın. magic=0 derleme için takıldı.
magic= 0İşlev
global kapsamdan çıkarın. magic=0 derleme için takıldı.
Kaldırıldı, derleme hatası yok, tp=0 sütunundaki işlevin üçüncü satırında harici değişken int tp=0 referans alınarak yalnızca 1 uyarı çıkıyor. Neyi sevmediğini tam olarak anlamıyorum. Tüm kodu ekliyorum, düzeltmek zor değilse, gerçek yakınlarda bir yerdedir.
Kaldırıldı, derleme hatası yok, tp=0 sütunundaki işlevin üçüncü satırında harici değişken int tp=0 referans alınarak yalnızca 1 uyarı çıkıyor. Neyi sevmediğini tam olarak anlamıyorum. Tüm kodu ekliyorum, düzeltmek zor değilse, gerçek yakınlarda bir yerdedir.
Bunun gibi
Senin durumunda, sihire hiç gerek yok
Bunun gibi
Senin durumunda, sihire hiç gerek yokTeşekkürler, test edip geri bildireceğim. Umarım benimki kadar iyi çalışır, ancak yeni çekime bir durak (işe yaradıysa) ekler.
Ve Input4'ün harici parametreleri nelerdir; 5; 6?
Teşekkürler, test edip geri bildireceğim. Umarım benimki kadar iyi çalışır, ancak yeni çekime bir durak (işe yaradıysa) ekler.
Bu sadece bir değişiklik. Sipariş silme veya geri alma yok.
Danışmanın ne yapması gerektiğini anlatırsanız yardımcı olmaya çalışırım.
Ve Input4'ün harici parametreleri nelerdir; 5; 6?
Danışmanın ne yapması gerektiğini anlatırsanız yardımcı olmaya çalışırım.
Satın almak için bekleyen bir emir koydum - danışman çalışıyor - bekleyen emir tetiklendi - danışman bunu "görüyor" ve bu açık siparişe koyuyor:
kaybı durdur (harici parametre ayarlarda ayarlanır);
kar al (ayarlarda bir katsayı aracılığıyla harici bir parametre ayarlanır, örneğin 1 ila 2);
zararı durdur seviyesinde satış yapmak için bekleyen bir emir .
Olası senaryolar.
Seçenek 1.
A) Fiyat alıma ulaşırsa, danışman zararı durdur ve bekleyen satış emrini kaldırır;
Seçenek 2.
B) Stoploss tetiklendiyse ve "işlem geçmişine gittiyse":
Bir satış emri açıldı ve EA bu siparişe aşağıdakileri yeniden yerleştirdi:
kaybı durdur (harici parametre ayarlarda ayarlanır);
geçmişten kâr + tetiklenen zararı durdur;
zararı durdur seviyesinde satın almak için bekleyen bir emir.
Fiyat alıma ulaştı - danışman zararı durdur ve bekleyen satın alma emrini kaldırır.
Ve tam tersi, iş bekleyen bir satışla başlarsa.
Ve böylece danışman, "Zarar Durdurma Sayısı" harici parametresi üzerindeki çalışmasını durdurana kadar çalışır (benim durumumda 2'dir - bu, 2. seçeneğin 3 kez tekrarlanacağı ve danışmanın gelecekte çalışmayı durduracağı ve tümünü kaldıracağı anlamına gelir. bekleyen emirleri hesaba katarak ilk durak gitmez).
İkinci varyantta hedefe bir durak eklenir. alıma ulaşılmazsa ve 2. seçenek tekrarlanırsa, belirtilen harici parametre "Zararı Durdurma numarası"na bağlı olarak alıma 2 durak eklenir ve bu şekilde devam eder.
Gönderdiğim kod, tarif ettiğim sorun dışında olması gerektiği gibi çalışıyor (geçmişte almaya eklenmesi gereken 1 durak veya 2 durak görmüyor).
Bunun gibi bir şey.
Satın almak için bekleyen bir emir koydum - danışman çalışıyor - bekleyen emir tetiklendi - danışman bunu "görüyor" ve bu açık siparişe koyuyor:
kaybı durdur (harici parametre ayarlarda ayarlanır);
kar al (ayarlarda bir katsayı aracılığıyla harici bir parametre ayarlanır, örneğin 1 ila 2);
zararı durdur seviyesinde satış yapmak için bekleyen bir emir .
Olası senaryolar.
Seçenek 1.
A) Fiyat alıma ulaşırsa, danışman zararı durdur ve bekleyen satış emrini kaldırır;
Seçenek 2.
B) Stoploss tetiklendiyse ve "işlemlerin geçmişine gittiyse":
Bir satış emri açıldı ve EA bu siparişe aşağıdakileri yeniden yerleştirdi:
kaybı durdur (harici parametre ayarlarda ayarlanır);
geçmişten kâr + tetiklenen zararı durdur;
zararı durdur seviyesinde satın almak için bekleyen bir emir.
Fiyat alıma ulaştı - danışman zararı durdur ve bekleyen satın alma emrini kaldırır.
Ve tam tersi, iş bekleyen bir satışla başlarsa.
Ve böylece danışman, "Zarar Durdurma Sayısı" harici parametresi üzerindeki çalışmasını durdurana kadar çalışır (benim durumumda 2'dir - bu, 2. seçeneğin 3 kez tekrarlanacağı ve danışmanın gelecekte çalışmayı durduracağı ve tümünü kaldıracağı anlamına gelir. bekleyen emirleri hesaba katarak ilk durak gitmez).
İkinci varyantta hedefe bir durak eklenir. alıma ulaşılmazsa ve 2. seçenek tekrarlanırsa, belirtilen harici parametre "Zararı Durdurma numarası"na bağlı olarak alıma 2 durak eklenir ve bu şekilde devam eder.
Gönderdiğim kod, tarif ettiğim sorun dışında olması gerektiği gibi çalışıyor (geçmişte almaya eklenmesi gereken 1 durak veya 2 durak görmüyor).
Bunun gibi bir şey.
"Zarar Durdurma Sayısı" - art arda mı yoksa mevcut gün için mi?
"Zarar Durdurma Sayısı" - art arda mı yoksa mevcut gün için mi?
Bir döviz çifti için art arda durak sayısı.
Danışman birkaç döviz çifti üzerinde durur ve geçmişe birkaç durak girer ve farklı sıralarda, geçmişi anlamak için danışman başlangıçta emirleri ID'lerle işaretler ancak geçmişte bulamaz, OrderMagikNumber()'ın görüneceğini düşündüm. onlar için. Belki de farklı döviz çiftlerinden gelen stopların tarihinde, danışmanın onları "görmeyi" bırakması nedeniyle?Bir çift üzerinde danışman olarak çalışmaya çalışmadım ve o zaman bundan bir anlamı olmayacak.
kaynağı tekrar yaz? Düzeltmesi gereken tek şey, "tarihten stop işlemlerini aramak ve yeni yerleştirilen alıma eklemesini sağlamaktır".