Vitaly Muzichenko: Das ist nicht klar. Wenn es notwendig ist, den EA zu stoppen, dann wird die vorgeschlagene Variante damit fertig, wenn es nicht notwendig ist, ihn zu stoppen, dann lassen Sie ihn handeln und schränken Sie ihn nicht in irgendeiner Weise ein. Wenn wir nach dem Stop auf Abruf handeln wollen, genügt es, die Zeit zu ändern, Disabled wird wahr und das Programm wird weiter arbeiten
Die Frage ist: Wie korrekt ist dieser Eintrag, der am Anfang des Programms steht, während im gesamten Programm viele Time[0] und Time[1] verwendet werden, die nicht jedes Mal aufgerufen werden müssen, sondern in eine Variable geschrieben werden. Es scheint keine Fehler außerhalb des Arrays zu geben, aber alles ist oberflächlich definiert:
Im Grunde genommen macht es keinen Unterschied, ob man auf eine Variable oder eine Array-Zelle zugreift. Vielleicht liegt es nur an der Erfassungsgeschwindigkeit, aber ich denke, es ist mikroskopisch, eine Messung mit Variablen und direktem Zugriff auf das Array durchzuführen.
Ich habe festgestellt, dass die Leute oft nach einer Schleppnetz- oder Break-even-Funktion fragen. Ich habe eine Blueprint-Funktion erstellt, mit der ein Stop auf ein bestimmtes Break-Even-Niveau verschoben und eine Stop-Position um den Wert eines Indikators nachgezogen werden kann, der seine Linien auf dem Preisdiagramm zeichnet (z. B. MA oder Parabolic), die der Funktion übergeben werden.
#property strict// в самое начало кода вашей программы (если нету там ещё)
// Функцию - за пределы остальных функций программы //+------------------------------------------------------------------+ //| Трейлинг по значению + перенос стопа на уровень безубытка | //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+
Generell gilt: Fragen Sie, wenn Sie etwas brauchen. Oder richtig.
Artyom Trishkin: Ich habe festgestellt, dass die Leute oft nach einer Schleppnetz- oder Break-even-Funktion fragen. Ich habe eine Blueprint-Funktion erstellt, mit der ein Stop auf ein bestimmtes Break-Even-Niveau verschoben und eine Stop-Position um den Wert eines Indikators nachgezogen werden kann, der seine Linien auf dem Preisdiagramm zeichnet (z. B. MA oder Parabolic), die der Funktion übergeben werden.
Generell gilt: Fragen Sie, wenn Sie etwas brauchen. Oder richtig
Hallo Artem, und was in CodeBase werden Sie es nicht platzieren? Mindestens ein weiterer korrekter Code wird vorhanden sein.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Das ist nicht klar. Wenn es notwendig ist, den EA zu stoppen, dann wird die vorgeschlagene Variante damit fertig, wenn es nicht notwendig ist, ihn zu stoppen, dann lassen Sie ihn handeln und schränken Sie ihn nicht in irgendeiner Weise ein. Wenn wir nach dem Stop auf Abruf handeln wollen, genügt es, die Zeit zu ändern, Disabled wird wahr und das Programm wird weiter arbeiten
Okay, danke.
Sie möchten wahrscheinlich die Möglichkeit haben, in den Eingabeparametern anzugeben, ob Sie nach Börsenschluss handeln oder nicht?
Wenn ja, dann bitte sehr:
// OnTick
if(OneTrade && !Disabled) return;
Ich habe die Flagge nicht vermasselt.
Sie möchten wahrscheinlich die Möglichkeit haben, in den Eingabeparametern anzugeben: "Handel nach Börsenschluss oder kein Handel nach Börsenschluss"?
Wenn ja, dann bitte sehr:
// OnTick
if(OneTrade && !Disabled) return;
Ich scheine mit der Flagge nichts falsch gemacht zu haben.
Ich danke Ihnen!
Die Frage ist: Wie korrekt ist dieser Eintrag, der am Anfang des Programms steht, während im gesamten Programm viele Time[0] und Time[1] verwendet werden, die nicht jedes Mal aufgerufen werden müssen, sondern in eine Variable geschrieben werden. Es scheint keine Fehler außerhalb des Arrays zu geben, aber alles ist oberflächlich definiert:
//------------
void OnTimer()
ArraySetAsSeries(TM, true);
if(CopyTime(_Symbol, PERIOD_CURRENT, 0, 2, TM)==-1) return;
TIME0 = TM[0];
TIME1 = TM[1];
Danke!
Darf ich Sie bitten, es ein wenig anzupassen?
Setzen Sie eine vertikale Linie beim aktuellen Kurs
oder einen Link zu einem EA, in dem dies verfügbar ist
Ich möchte verstehen, wie man die Parameter des Bots verteilt, damit er funktioniert
Darf ich Sie bitten, es ein wenig anzupassen?
Setzen Sie eine vertikale Linie beim aktuellen Kurs
oder einen Link zu einem EA, in dem dies verfügbar ist
Ich möchte verstehen, wie man die Parameter des Bots verteilt, damit er funktioniert
Zuerst müssen Sie die Kursanzeige um 90 Grad drehen.
Beitrag 998.
Es ist mir egal, ob es horizontal oder vertikal ist, es ist nur so, dass das, was ich dort gemacht habe, im Moment nicht funktioniert.
Beitrag 998.
Es ist mir egal, ob es horizontal oder vertikal ist, es ist nur so, dass das, was ich dort gemacht habe, jetzt nicht mehr funktioniert.
// Функцию - за пределы остальных функций программы
//+------------------------------------------------------------------+
//| Трейлинг по значению + перенос стопа на уровень безубытка |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
Ich habe festgestellt, dass die Leute oft nach einer Schleppnetz- oder Break-even-Funktion fragen. Ich habe eine Blueprint-Funktion erstellt, mit der ein Stop auf ein bestimmtes Break-Even-Niveau verschoben und eine Stop-Position um den Wert eines Indikators nachgezogen werden kann, der seine Linien auf dem Preisdiagramm zeichnet (z. B. MA oder Parabolic), die der Funktion übergeben werden.
Generell gilt: Fragen Sie, wenn Sie etwas brauchen. Oder richtig