string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
Berechnung des gleitenden Durchschnitts. Wenn Sie eine Formel brauchen, kann Google sie auch leicht finden. Oder verstehen Sie den Begriff "linear-gewichtet" nicht?
Als erste Erfahrung beschloss ich, den folgenden Algorithmus zu implementieren: Wenn die Bollinger-Linien in einem engen Korridor zu nahe beieinander liegen, kann man davon ausgehen, dass sich der Markt in einiger Zeit schnell nach oben oder unten bewegen wird. In meinem Expert Advisor analysiere ich den Zustand der Bollinger-Linien, und wenn sie sich sehr stark annähern(Delta-Pips), erteilen wir einen schwebenden Verkaufsauftrag in der unteren Richtung (bei stepOpen-Pips unter der unteren Linie), in der Hoffnung, dass der Markt plötzlich in diese Richtung geht. Wenn sich der Markt in eine andere Richtung entwickelt, löschen wir diesen Auftrag einfach.
externdouble Delta=800.0; // Ширина канала, которую мы считаем достаточно узкой чтобы ожидать скоро серьезного движения в одну из сторонexterndouble StepOpen=150.0; // Отступ от линии Боллинджера для открытия отложенного ордераexterndouble TP=350.0; // Take Profitexterndouble SL=400.0; // Stop Lossint start()
{
double T1=iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,0); // верхняя линия Боллинджераdouble T2=iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,0); // нижняя линия Боллинджераif ((Ask>T1+StepOpen*Point)&&OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true) OrderDelete(0); // если рынок пошел вверх – то удаляем отложенный ордерif (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true) return(0); // если есть ранее открытый ордер – прекращаем выполнение текущей итерации советникаif (T1-T2<Delta*Point) { // если линии Боллинджера сблизились ближе чем на Delta пунктов начинаем операцию открытия ордераdouble PriceOpen=NormalizeDouble(T2-StepOpen*Point,5); // вычисляем цену открытияdouble StopLoss=NormalizeDouble(T2-StepOpen*Point+SL*Point,5); // вычисляем StopLossdouble TakeProfit=NormalizeDouble(T2-StepOpen*Point-TP*Point,5); // вычисляем TakeProfitOrderSend(Symbol(),OP_SELL,0.1,PriceOpen,5,StopLoss,TakeProfit,0,0,0,Green); // открываем ордер на продажу
}
return(0);
}
Der Algorithmus arbeitet instabil, öffnet manchmal zwei Aufträge in einem kurzen Zeitraum, gibt ständig die Fehler OrderSend Error 130 und OrderSend Error 138 aus, und das Entfernen offener Aufträge, falls sich der Markt in die andere Richtung bewegt, funktioniert überhaupt nicht.
static datetime PrevTime=0; //Vorletzte Öffnungszeit des Balkens
//Zusätzliche Kontrollen
if (PrevTime==0) PrevTime=Time[0]; // beim ersten Start wird der aktuelle Takt übersprungen
if (Time[0]<=PrevTime) return(0); // Überprüfung der neuen Öffnungszeit des Balkens
//--Ihr grundlegender Code
PrevTime=Time[0]; // Erinnern Sie sich an den Zeitpunkt der Eröffnung des Nullbalkens
zurück(0);
}
Wenn Sie eine Bar geöffnet haben, hier ist die Vorlage, es funktioniert.
Ich möchte Sie bitten, diese Funktion in Ihren EA einzufügen. Auf dem Bild sehen Sie, dass 3 Aufträge auf einem Balken geöffnet sind. Ich brauche nur einen. Ich kann den Code nicht reparieren.
//+------------------------------------------------------------------+int start()
//+------------------------------------------------------------------+
{
//--- Разрешение на открытие позиций - каждую свечуif(candle_time != Time[0])
{
candle_time = Time[0];
new_bar_buy = true;
new_bar_sell = true;
}
if (Bars < bars_count){Print("Мало данных для работы"); return(0);}
//--- Получение значений индикатора iMA
ma10 = iMA ( Symbol(), Period(), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift);
ma20 = iMA ( Symbol(), Period(), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift);
ma11 = iMA ( Symbol(), Period(), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift+1);
ma21 = iMA ( Symbol(), Period(), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift+1);
if (Revers)
{
if(rsi>50 && rsi<70)//--- включена инверсия
{
//--- Условие для продажиif(ma11 < ma21 && ma10 > ma20 && ma30 > ma10 && new_bar_sell)
{
sell_open=true;
new_bar_sell = false;
}
}
if(rsi>30 && rsi<50)//--- включена инверсия
{
//--- Условие для продажиif(ma11 > ma21 && ma10 < ma20 && ma30 < ma10 && new_bar_buy)
{
buy_open=true;
new_bar_buy = false;
}
}
}
//--- выставление рыночных ордеровif(IsTradeAllowed())
{
Trade_BUY();
Trade_SELL();
}
return(0);
//+------------------------------------------------------------------+void Trade_BUY()
//+------------------------------------------------------------------+
{
for ( int i = 0; i < OrdersTotal(); i++ )
{
if ( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
{
if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != Magic)) continue; //не наш ордерif ( OrderType() == OP_BUY) // если ордер OP_BUY
{
min_level = MarketInfo( Symbol(), MODE_STOPLEVEL );
//--- проверка на работу трейлинг стопаif (trailing_stop !=0.0 && Ask > NormalizeDouble(OrderStopLoss() + (stop_loss_buy + MathMax(min_level, trailing_stop)) * Point, Digits) && OrderProfit() > 0)
{
if ( OrderModify ( OrderTicket(), OrderOpenPrice(),
NormalizeDouble (OrderStopLoss() + MathMax(min_level, trailing_stop) * Point, Digits),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("Сработал трейлинг стоп для Buy");
}
else
{
Print ("Ошибка модификации ордера #", GetLastError());
}
RefreshRates();
Sleep(3000);
} //end modify
}// end BUY
}//end OrderSelectelse
{
Print( "OrderSelect ошибка #", GetLastError() );
Sleep(3000);
RefreshRates();
return;
}
}// end for//--- Открываем ордер если есть сигналwhile (buy_open)
{
//--- нормализация лота
lot = Normalize_Lot(Lots);
//--- проверка на наличие свободной маржиif( AccountFreeMarginCheck(Symbol(),OP_BUY, lot) <= 0 || GetLastError() == 134 )
{
Print("Недостаточно свободной маржи для открытия ордера");
buy_open = false;
break;
}
min_level = MarketInfo( Symbol(), MODE_STOPLEVEL );
if ( OrderSend( Symbol(), OP_BUY, lot, NormalizeDouble(Ask, Digits), slippage,
NormalizeDouble(Bid - MathMax(stop_loss_buy, min_level) * Point, Digits),
NormalizeDouble(Bid + MathMax(take_profit_buy,min_level) * Point, Digits),
DoubleToStr(Magic, 0), Magic, 0, Blue) > 0 )
{
PlaySound("Wait.wav");
buy_open = false; // ордер открытbreak;
}
else
{
int Error = GetLastError(); // Не получилось :(switch(Error) // Преодолимые ошибки
{
case138:Alert("Ошибка: ",Error," Новые цены.");
RefreshRates();
continue;
case135:Alert("Ошибка: ",Error," Цена изменилась.");
RefreshRates();
continue;
case136:Alert("Нет цен.");
while(RefreshRates() == false)
Sleep(500);
continue;
case146:Alert("Подсистема торговли занята.");
Sleep(500);
RefreshRates();
continue;
default: Alert("Возникла ошибка ", Error," Выход из подпрограммы."); // Другие варианты ошибок
}// end switch
}// end elsebreak;
}// end while
}// end Trade_BUY//+------------------------------------------------------------------+void Trade_SELL()
//+------------------------------------------------------------------+
{
for ( int i = 0; i < OrdersTotal(); i++ )
{
if ( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
{
if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != Magic)) continue; //не наш ордерif ( OrderType() == OP_SELL) //если ордер OP_SELL
{
min_level = MarketInfo( Symbol(), MODE_STOPLEVEL );
//--- проверка на работу трейлинг стопаif (trailing_stop !=0.0 && Bid < NormalizeDouble(OrderStopLoss() - (stop_loss_sell + MathMax(min_level, trailing_stop)) * Point, Digits)&&OrderProfit() > 0)
{
if ( OrderModify ( OrderTicket(), OrderOpenPrice(),
NormalizeDouble (OrderStopLoss() - MathMax(min_level, trailing_stop) * Point, Digits),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("Сработал трейлинг стоп для Sell");
}
else
{
Print ( "Ошибка модификации ордера #", GetLastError());
}
RefreshRates();
Sleep(3000);
}
}// end BUY
}//end OrderSelectelse
{
Print( "OrderSelect ошибка #", GetLastError() );
Sleep(3000);
RefreshRates();
return;
}
}// end for//--- Открываем ордер если есть сигналwhile (sell_open)
{
//--- нормализация лота
lot = Normalize_Lot(Lots);
//--- проверка на наличие свободной маржиif( AccountFreeMarginCheck(Symbol(),OP_SELL, lot) <= 0 || GetLastError() == 134 )
{
Print("Недостаточно свободной маржи для открытия ордера");
sell_open = false;
break;
}
min_level = MarketInfo( Symbol(), MODE_STOPLEVEL );
if ( OrderSend( Symbol(), OP_SELL, lot, NormalizeDouble(Bid, Digits), slippage,
NormalizeDouble(Ask + MathMax(stop_loss_sell, min_level) * Point, Digits),
NormalizeDouble(Ask - MathMax(take_profit_sell, min_level) * Point, Digits),
DoubleToStr(Magic, 0), Magic, 0, Blue) > 0 )
{
PlaySound("Wait.wav");
sell_open = false; // ордер открытbreak;
}
else
{
int Error = GetLastError(); // Не получилось :(switch(Error) // Преодолимые ошибки
{
case138:Alert("Ошибка: ",Error," Новые цены.");
RefreshRates();
continue;
case135:Alert("Ошибка: ",Error," Цена изменилась.");
RefreshRates();
continue;
case136:Alert("Нет цен.");
while(RefreshRates() == false)
Sleep(500);
continue;
case146:Alert("Подсистема торговли занята.");
Sleep(500);
RefreshRates();
continue;
default: Alert("Возникла ошибка ", Error," Выход из подпрограммы."); // Другие варианты ошибок
}// end switch
}// end elsebreak;
}// end while
}// end Trade_SELL//+------------------------------------------------------------------+double Normalize_Lot(double lot)// Проверка на допустимое значение лота//+------------------------------------------------------------------+
{
double lot_min = MarketInfo(Symbol(), MODE_MINLOT);
double lot_max = MarketInfo(Symbol(), MODE_MAXLOT);
double lot_step = MarketInfo(Symbol(), MODE_LOTSTEP);
if ( lot <= lot_min ) lot = lot_min; // минимальныйelseif ( lot >= lot_max ) lot = lot_max; // максимальныйelse lot = MathFloor( lot / lot_step ) * lot_step ; // округление до ближайшего меньшегоreturn(lot);
}
//+------------------------------------------------------------------+int MathMax4(int i1,int i2,int i3,int i4)// Возврат максимального значения//+------------------------------------------------------------------+
{
int imax=i1;
if(i2>imax)imax=i2;
if(i3>imax)imax=i3;
if(i4>imax)imax=i4;
return(imax);
}
Hilfe im Berater, um die Eröffnung von Aufträgen auf 1 pro Tag zu begrenzen, unabhängig davon, wie oft er einen Einstiegspunkt passiert...
Ich versuche, so etwas zu schreiben, es prüft Geschichte der letzten geschlossenen Bestellung vor dem Öffnen, und wenn es dann übereinstimmt, öffnen Sie nicht...
Guten Tag, liebe Forumsnutzer. Brauchen Sie Hilfe bei der Änderung der EA, dh alles so lassen, wie es ist, aber ändern Sie die Aktion (kaufen/verkaufen) zu (verkaufen/kaufen), meine Tests zeigten, dass der Aufwärtstrend zu verkaufen, und der Abwärtstrend zu kaufen. eine einfache Änderung im Code BUY auf SELL mir nichts, oder etwas verpasst, oder .... Wie auch immer, ich brauche Hilfe Danke im Voraus.
Wie wird der iMA berechnet?
Kann ich irgendwo nachlesen, wie die iMA-Funktion berechnet wird (oder ist sie klassifiziert)?
Ich interessiere mich besonders für MODE_LWMA.
Ich möchte schauen und optimieren nach meinem Geschmack, aber etwas googeln den Quellcode nicht bekommen
https://docs.mql4.com/ru/indicators/iMA
Sie brauchen eine Formel, damit Google sie auch leicht finden kann.
https://docs.mql4.com/ru/indicators/iMA
Wenn Sie eine Formel brauchen, kann Google sie auch leicht finden.
Oder verstehen Sie den Begriff "linear-gewichtet" nicht?
Где-нибудь можно найти как вычисляется функция iMA (или она засекреченная)
Особеннно меня интересует MODE_LWMA.
Хочу посмотреть и подправить на свой вкус, но что-то нагуглить исходники не получилось
Guten Tag!
Als erste Erfahrung beschloss ich, den folgenden Algorithmus zu implementieren: Wenn die Bollinger-Linien in einem engen Korridor zu nahe beieinander liegen, kann man davon ausgehen, dass sich der Markt in einiger Zeit schnell nach oben oder unten bewegen wird. In meinem Expert Advisor analysiere ich den Zustand der Bollinger-Linien, und wenn sie sich sehr stark annähern(Delta-Pips), erteilen wir einen schwebenden Verkaufsauftrag in der unteren Richtung (bei stepOpen-Pips unter der unteren Linie), in der Hoffnung, dass der Markt plötzlich in diese Richtung geht. Wenn sich der Markt in eine andere Richtung entwickelt, löschen wir diesen Auftrag einfach.
Der Algorithmus arbeitet instabil, öffnet manchmal zwei Aufträge in einem kurzen Zeitraum, gibt ständig die Fehler OrderSend Error 130 und OrderSend Error 138 aus, und das Entfernen offener Aufträge, falls sich der Markt in die andere Richtung bewegt, funktioniert überhaupt nicht.Bitte, beraten Sie uns! Ich danke Ihnen!
Viktor Iwanowitsch!
So viel zum Durchblättern, warum haben Sie keinen Link angegeben? Sie geben den Code ein... Und wozu?
//--Ihr grundlegender Code
PrevTime=Time[0]; // Erinnern Sie sich an den Zeitpunkt der Eröffnung des Nullbalkens
Wenn Sie eine Bar geöffnet haben, hier ist die Vorlage, es funktioniert.
Ich möchte Sie bitten, diese Funktion in Ihren EA einzufügen. Auf dem Bild sehen Sie, dass 3 Aufträge auf einem Balken geöffnet sind. Ich brauche nur einen. Ich kann den Code nicht reparieren.
Hallo an alle ))))
Hilfe im Berater, um die Eröffnung von Aufträgen auf 1 pro Tag zu begrenzen, unabhängig davon, wie oft er einen Einstiegspunkt passiert...
Ich versuche, so etwas zu schreiben, es prüft Geschichte der letzten geschlossenen Bestellung vor dem Öffnen, und wenn es dann übereinstimmt, öffnen Sie nicht...
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
{
if(OrderCloseTime()==Day()
break;
}
das funktioniert nicht, bitte helfen Sie der lamochinka ))))
Bestellung auf einer Bar site:mql4.com
https://www.mql5.com/ru/forum/102366/page3
Brauchen Sie Hilfe bei der Änderung der EA, dh alles so lassen, wie es ist, aber ändern Sie die Aktion (kaufen/verkaufen) zu (verkaufen/kaufen), meine Tests zeigten, dass der Aufwärtstrend zu verkaufen, und der Abwärtstrend zu kaufen. eine einfache Änderung im Code BUY auf SELL mir nichts, oder etwas verpasst, oder .... Wie auch immer, ich brauche Hilfe
Danke im Voraus.