MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 256
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Kendi bellek çipimden bahsediyordum. :)))
Kod yazarken kolayca iki kez kontrol edilebilecek, açıklığa kavuşturulabilecek, olması gerektiği gibi yapılabilecek ve tekrar unutulabilecek önemsiz şeyleri hatırlamıyorum.
İnsanların genellikle sondaki veya başabaş işlevini sorduğunu fark ettim. Burada, stop'u belirli bir başabaş seviyesine taşımak ve fiyat grafiğinde çizgilerini çizen fonksiyona (örneğin MA veya parabolik) geçen bir göstergenin değerine göre pozisyon stopunu takip etmek için bir saplama işlevi ekledim.
// Функцию - за пределы остальных функций программы
//+------------------------------------------------------------------+
//| Трейлинг по значению + перенос стопа на уровень безубытка |
//+------------------------------------------------------------------+
void TrailingByLevel( string symbol_name, // Имя символа
int magic_number, // Magic ордера
double level_of_trail, // Уровень, на который ставим стоп (например МА или Parabolic SAR)
int trailing_start, // Профит в пунктах для старта трала
int trailing_step, // Шаг трала в пунктах
int trailing_stop, // Отступ стоплосс от уровня МА или SAR в пунктах
int profit_for_breakeven= 15 , // Профит в пунктах для переноса стопа в безубыток
int breakeven_level= 5 , // Уровень безубытка в пунктах
bool use_trail= true , // Флаг использования трала
bool use_breakeven= false // Флаг использования безубытка
)
{
int lv=StopLevel(symbol_name)+ 1 ; // Получаем значение Stop Level по символу + 1 пункт (из отдельной функции)
for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
if ( OrderSelect (i, SELECT_BY_POS )) {
if ( OrderMagicNumber ()!=magic_number) continue ; //Если Магик не наш - идем к следующему ордеру
if ( OrderSymbol ()!=symbol_name) continue ; //Если Символ не наш - идем к следующему ордеру
//--- покупки
if ( OrderType ()== OP_BUY ) {
int digits=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
double point=( SymbolInfoDouble (symbol_name, SYMBOL_POINT ));
double pb= SymbolInfoDouble (symbol_name, SYMBOL_BID );
double profit=pb- OrderOpenPrice (); // Профит позиции в цене (без комиссий и свопов)
//--- безубыток
if (use_breakeven) {
//--- если профит в цене больше заданного
if (profit>=profit_for_breakeven*point) {
int err= ERR_NO_ERROR ;
double sl= NormalizeDouble ( OrderOpenPrice ()+breakeven_level*point,digits);
if (pb-lv*point>sl && OrderStopLoss ()<sl) {
// Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
// OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
// ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
//ModifyOrder(-1,sl,-1,err);
}
if (err== ERR_MARKET_CLOSED ) return ;
}
}
//--- трал
if (use_trail) {
//--- если профит в пунктах больше заданного, или изначально задан меньше ноля
if (profit>=trailing_start*point || trailing_start== EMPTY ) {
int err= ERR_NO_ERROR ;
double sl= NormalizeDouble (level_of_trail-trailing_stop*point,digits); // вычисляем новый уровень стоплосс по значению, переданному в функцию
//--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
if (pb-lv*point>sl && OrderStopLoss ()+trailing_step*point<sl) {
// Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
// OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
// ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
//ModifyOrder(-1,sl,-1,err);
}
if (err== ERR_MARKET_CLOSED ) return ;
}
}
}
//--- Продажи
if ( OrderType ()== OP_SELL ) {
int digits=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
double point=( SymbolInfoDouble (symbol_name, SYMBOL_POINT ));
double pa= SymbolInfoDouble (symbol_name, SYMBOL_ASK );
double profit= OrderOpenPrice ()-pa; // Профит позиции в цене (без комиссий и свопов)
//--- безубыток
if (use_breakeven) {
//--- если профит в цене больше заданного
if (profit>=profit_for_breakeven*point) {
int err= ERR_NO_ERROR ;
double sl= NormalizeDouble ( OrderOpenPrice ()-breakeven_level*point,digits);
if (pa+lv*point<sl && ( OrderStopLoss ()>sl || OrderStopLoss ()== 0 )) {
// Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
// OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
// ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
//ModifyOrder(-1,sl,-1,err);
}
if (err== ERR_MARKET_CLOSED ) break ;
}
}
//--- трал
if (use_trail) {
//--- если профит в пунктах больше заданного, или изначально задан меньше ноля
if (profit>=trailing_start*point || trailing_start== EMPTY ) {
int err= ERR_NO_ERROR ;
double sl= NormalizeDouble (level_of_trail+trailing_stop*point,digits); // вычисляем новый уровень стоплосс по значению, переданному в функцию
//--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
if (pa+lv*point<sl && ( OrderStopLoss ()-trailing_step*point>sl || OrderStopLoss ()== 0 )) {
// Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
// OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
// ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
//ModifyOrder(-1,sl,-1,err);
}
if (err== ERR_MARKET_CLOSED ) break ;
}
}
}
}
}
}
//+------------------------------------------------------------------+
int StopLevel( string symbol_name) {
int sp=( int ) SymbolInfoInteger (symbol_name, SYMBOL_SPREAD );
int lv=( int ) SymbolInfoInteger (symbol_name, SYMBOL_TRADE_STOPS_LEVEL );
return ((lv== 0 )?sp* 2 :lv);
}
//+------------------------------------------------------------------+
Uzman Danışmanımı geliştirmeme yardım eder misin? Stopları koyan, ancak stop kayıplarının nasıl sürükleneceğini bilmeyen bir Uzman Danışmanım var. Bunu hiç anlamıyorum ve bir uzmanın yardımını umuyorum.
Bir dizi öğesinin ağırlığını belirlemek için bir işleve ihtiyacınız var. Belirli bir öğeye yakın olan (ve daha yakın olan) diğer öğelerin sayısı arttıkça, ağırlığı da artar. Belki böyle bir özellik zaten vardır. Bir numunedeki bir elementin ağırlığını, numunedeki elementlerin konsantrasyonuyla belirlemek gibi bir şey. Teşekkür ederim.
Merhaba! MQL4 test cihazında neden yalnızca bir yinelemenin geçtiğini ve sonra durduğunu anlayamıyorum ? TimeCurrent() güncellenmiyor mu? Nasıl güncellenir? Çoklu para birimi danışmanının kenelerle değil, her saniye veya saniyede 5 kez daha iyi çalışması gerekir.
Merhaba! MQL4 test cihazında neden yalnızca bir yinelemenin geçtiğini ve sonra durduğunu anlayamıyorum ? TimeCurrent() güncellenmiyor mu? Nasıl güncellenir? Çoklu para birimi danışmanının kenelerle değil, her saniye veya saniyede 5 kez daha iyi çalışması gerekir.
Danışman olarak bir şey mi başlatıyorsunuz? yani uzmanlar dizininden ??
Uzman Danışmanlar için start() işlevi (eski adı, modern OnTick) her tik üzerinde başlatılır, yani tik bittiğinde bitmesi gerekir. Ve sende var zatsiklina
Danışman olarak bir şey mi başlatıyorsunuz? yani uzmanlar dizininden ??
Uzman Danışmanlar için start() işlevi (eski adı, modern OnTick) her tik üzerinde başlatılır, yani tik bittiğinde bitmesi gerekir. Ve sende var zatsiklina
https://book.mql4.com/en/special/index
Tabii ki döngü yapabilirsiniz. Ancak bir sonraki TIC tarafından bırakılması tavsiye edilir. Aksi takdirde, TIC kaybolacaktır. O gerekli mi?
Tabii ki döngü yapabilirsiniz. Ancak bir sonraki TIC tarafından bırakılması tavsiye edilir. Aksi takdirde, TIC kaybolacaktır. O gerekli mi?
neden kayıp? RefreshRates () işlevi kullanılarak yeni bir onay işareti hakkında bilgi alınabilir; sonsuz döngüde
Yeniler () işlevi sadece kontrol eder. Veriler güncellendiyse true değerini döndürür. Bunu while(! RefreshRates ()); - bekleyen kene
Yeniler () işlevi sadece kontrol eder . Veriler güncellendiyse true değerini döndürür. Bunu while(! RefreshRates ()); - bekleyen kene
Güncellemeler (insanları kandırmayın) ve güncelleme için bir başarı veya başarısızlık bayrağı döndürür.
SymbolInfoDouble() , SymbolInfoTick() kullanarak veri alırsanız onsuz yapabilirsiniz.