Hängen Sie entweder den gesamten Code an oder initialisieren Sie Ihre Variablen vor dem Code-Snippet. Man weiß nie, was man da in den Variablen hat, zum Beispiel in
Gesamtcode:
//+------------------------------------------------------------------+//| USSR.mq5 |//| Copyright 2014, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2014, MetaQuotes Software Corp."#property link"http://www.mql5.com"#property version"1.00"#include <Trade\Trade.mqh>
//--- input parameters// Входные параметрыinputint StopLoss= 15 ; // Stop Lossinputint TakeProfit= 30 ; // Take Profitinputint ADX_Period= 8 ; // Период ADXinputint MA_Period= 8 ; // Период Moving Averageinputint EA_Magic= 12345 ; // Magic Number советникаinputdouble Adx_Min= 22.0 ; // Минимальное значение ADXinputdouble Lot= 0.01 ; // Количество лотов для торговли//--- глобальные переменныеulong tik= 0 ;
int adxHandle; // хэндл индикатора ADXint maHandle; // хэндл индикатора Moving Averagedouble plsDI[],minDI[],adxVal[]; // динамические массивы для хранения численных значений +DI, -DI и ADX для каждого бараdouble maVal[]; // динамический массив для хранения значений индикатора Moving Average для каждого бараdouble p_close; // переменная для хранения значения close бараint STP,TKP; // будут использованы для значений Stop Loss и Take Profitint TrailingStop=TakeProfit;
double Bid;
CTrade trade;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+//Инациализация советникаintOnInit ()
{
//--- Получить хэндл индикатора ADX
adxHandle= iADX ( NULL , 0 ,ADX_Period);
//--- Получить хэндл индикатора Moving Average
maHandle= iMA ( _Symbol , _Period ,MA_Period, 0 , MODE_EMA , PRICE_CLOSE );
//--- Нужно проверить, не были ли возвращены значения Invalid Handleif (adxHandle< 0 || maHandle< 0 )
{
Alert ( "Ошибка при создании индикаторов - номер ошибки: " , GetLastError (), "!!" );
return (- 1 );
}
STP = StopLoss;
TKP = TakeProfit;
if ( _Digits == 5 || _Digits == 3 )
{
STP = STP* 10 ;
TKP = TKP* 10 ;
}
return ( 0 );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+//Выключение советникаvoidOnDeinit ( constint reason)
{
IndicatorRelease (adxHandle);
IndicatorRelease (maHandle);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+//Обработка событийvoidOnTick ()
{
while (tik== 0 )
{
//--- Достаточно ли количество баров для работыif ( Bars ( _Symbol , _Period )< 60 ) // общее количество баров на графике меньше 60?
{
Alert ( "На графике меньше 60 баров, советник не будет работать!!" );
return ;
}
// Для сохранения значения времени бара мы используем static-переменную Old_Time.// При каждом выполнении функции OnTick мы будем сравнивать время текущего бара с сохраненным временем.// Если они не равны, это означает, что начал строится новый бар.staticdatetime Old_Time;
datetime New_Time[ 1 ];
bool IsNewBar= false ;
// копируем время текущего бара в элемент New_Time[0]int copied= CopyTime ( _Symbol , _Period , 0 , 1 ,New_Time);
if (copied> 0 ) // ok, успешно скопировано
{
if (Old_Time!=New_Time[ 0 ]) // если старое время не равно
{
IsNewBar= true ; // новый барif ( MQL5InfoInteger ( MQL5_DEBUGGING )) Print ( "Новый бар" ,New_Time[ 0 ], "старый бар" ,Old_Time);
Old_Time=New_Time[ 0 ]; // сохраняем время бара
}
}
else
{
Alert ( "Ошибка копирования времени, номер ошибки =" , GetLastError ());
ResetLastError ();
return ;
}
//--- советник должен проверять условия совершения новой торговой операции только при новом бареif (IsNewBar== false )
{
return ;
}
//--- Имеем ли мы достаточное количество баров на графике для работыint Mybars= Bars ( _Symbol , _Period );
if (Mybars< 60 ) // если общее количество баров меньше 60
{
Alert ( "На графике менее 60 баров, советник работать не будет!!" );
return ;
}
//--- Объявляем структуры, которые будут использоваться для торговлиMqlTick latest_price; // Будет использоваться для текущих котировокMqlTradeRequest mrequest; // Будет использоваться для отсылки торговых запросовMqlTradeResult mresult; // Будет использоваться для получения результатов выполнения торговых запросовMqlRates mrate[]; // Будет содержать цены, объемы и спред для каждого бараZeroMemory (mrequest);
/*
Установим индексацию в массивах котировок и индикаторов
как в таймсериях
*/// массив котировокArraySetAsSeries (mrate, true );
// массив значений индикатора ADX DI+ArraySetAsSeries (plsDI, true );
// массив значений индикатора ADX DI-ArraySetAsSeries (minDI, true );
// массив значений индикатора ADXArraySetAsSeries (adxVal, true );
// массив значений индикатора MA-8ArraySetAsSeries (maVal, true );
//--- Получить текущее значение котировки в структуру типа MqlTickif (! SymbolInfoTick ( _Symbol ,latest_price))
{
Alert ( "Ошибка получения последних котировок - ошибка:" , GetLastError (), "!!" );
return ;
}
//--- Получить исторические данные последних 3-х баровif ( CopyRates ( _Symbol , _Period , 0 , 3 ,mrate)< 0 )
{
Alert ( "Ошибка копирования исторических данных - ошибка:" , GetLastError (), "!!" );
return ;
}
//--- Используя хэндлы индикаторов, копируем новые значения индикаторных буферов в массивыif ( CopyBuffer (adxHandle, 0 , 0 , 3 ,adxVal)< 0 || CopyBuffer (adxHandle, 1 , 0 , 3 ,plsDI)< 0
|| CopyBuffer (adxHandle, 2 , 0 , 3 ,minDI)< 0 )
{
Alert ( "Ошибка копирования буферов индикатора ADX - номер ошибки:" , GetLastError (), "!!" );
return ;
}
if ( CopyBuffer (maHandle, 0 , 0 , 3 ,maVal)< 0 )
{
Alert ( "Ошибка копирования буферов индикатора Moving Average - номер ошибки:" , GetLastError ());
return ;
}
//--- есть ли открытые позиции?bool Buy_opened= false ; // переменные, в которых будет храниться информация bool Sell_opened= false ; // о наличии соответствующих открытых позицийif ( PositionSelect ( _Symbol )== true ) // есть открытая позиция
{
if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
{
Buy_opened= true ; // это длинная позиция
}
elseif ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
{
Sell_opened= true ; // это короткая позиция
}
}
// Скопируем текущую цену закрытия предыдущего бара (это бар 1)
p_close=mrate[ 1 ].close; // цена закрытия предыдущего бара/*
1. Проверка условий для покупки : MA-8 растет,
предыдущая цена закрытия бара больше MA-8, ADX > 22, +DI > -DI
*///--- объявляем переменные типа boolean, они будут использоваться при проверке условий для покупкиbool Buy_Condition_1=(maVal[ 0 ]>maVal[ 1 ]) && (maVal[ 1 ]>maVal[ 2 ]); // MA-8 растетbool Buy_Condition_2 = (p_close > maVal[ 1 ]); // предыдущая цена закрытия выше скользяшей средней MA-8bool Buy_Condition_3 = (adxVal[ 0 ]>Adx_Min); // текущее значение ADX больше, чем минимальное (22)bool Buy_Condition_4 = (plsDI[ 0 ]>minDI[ 0 ]); // +DI больше, чем -DI//--- собираем все вместеif (Buy_Condition_1 && Buy_Condition_2)
{
if (Buy_Condition_3 && Buy_Condition_4)
{
// есть ли в данный момент открытая позиция на покупку?if (Sell_opened)
{
Alert ( "Уже есть позиция на покупку !!!" );
return ; // не добавлять к открытой позиции на покупку
}
mrequest.action = TRADE_ACTION_DEAL ; // немедленное исполнение
mrequest.price = NormalizeDouble (latest_price.ask, _Digits ); // последняя цена ask
mrequest.sl = NormalizeDouble (latest_price.ask + STP* _Point , _Digits ); // Stop Loss
mrequest.tp = NormalizeDouble (latest_price.ask - TKP* _Point , _Digits ); // Take Profit
mrequest.symbol= _Symbol ; // символ
mrequest.volume = Lot; // количество лотов для торговли
mrequest.magic = EA_Magic; // Magic Number
mrequest.type= ORDER_TYPE_SELL ; // ордер на покупку
mrequest.type_filling = ORDER_FILLING_FOK ; // тип исполнения ордера - все или ничего
mrequest.deviation= 100 ; // проскальзывание от текущей цены//--- отсылаем ордерOrderSend (mrequest,mresult);
// анализируем код возврата торгового сервераif (mresult.retcode== 10009 || mresult.retcode== 10008 ) // запрос выполнен или ордер успешно помещен
{
tik=mresult.order;
Alert ( "Ордер Buy успешно помещен, тикет ордера #:" ,mresult.order, "!!" );
}
else
{
Alert ( "Запрос на установку ордера Buy не выполнен - код ошибки:" , GetLastError ());
return ;
}
}
}
/*
2. Проверка условий для продажи : MA-8 падает,
предыдущая цена закрытия бара меньше MA-8, ADX > 22, -DI > +DI
*///--- объявляем переменные типа boolean, они будут использоваться при проверке условий для продажиbool Sell_Condition_1 = (maVal[ 0 ]<maVal[ 1 ]) && (maVal[ 1 ]<maVal[ 2 ]); // MA-8 падаетbool Sell_Condition_2 = (p_close <maVal[ 1 ]); // предыдущая цена закрытия ниже MA-8bool Sell_Condition_3 = (adxVal[ 0 ]>Adx_Min); // текущее значение ADX value больше заданного (22)bool Sell_Condition_4 = (plsDI[ 0 ]<minDI[ 0 ]); // -DI больше, чем +DI//--- собираем все вместеif (Sell_Condition_1 && Sell_Condition_2)
{
if (Sell_Condition_3 && Sell_Condition_4)
{
// есть ли в данный момент открытая позиция на продажу?if (Buy_opened)
{
Alert ( "Уже есть позиция на продажу!!!" );
return ; // не добавлять к открытой позиции на продажу
}
mrequest.action= TRADE_ACTION_DEAL ; // немедленное исполнение
mrequest.price= NormalizeDouble (latest_price.bid, _Digits ); // последняя цена Bid
mrequest.sl = NormalizeDouble (latest_price.bid - STP* _Point , _Digits ); // Stop Loss
mrequest.tp = NormalizeDouble (latest_price.bid + TKP* _Point , _Digits ); // Take Profit
mrequest.symbol= _Symbol ; // символ
mrequest.volume = Lot; // количество лотов для торговли
mrequest.magic = EA_Magic; // Magic Number
mrequest.type= ORDER_TYPE_BUY ; // ордер на продажу
mrequest.type_filling= ORDER_FILLING_FOK ; // тип исполнения ордера - все или ничего
mrequest.deviation= 100 ; // проскальзывание от текущей цены//--- отсылаем ордерOrderSend (mrequest,mresult);
// получаем код ответа торгового сервераif (mresult.retcode== 10009 || mresult.retcode== 10008 ) // запрос выполнен или ордер успешно помещен
{
tik=mresult.order;
Alert ( "Ордер Sell успешно помещен, тикет ордера #:" ,mresult.order, "!!" );
}
else
{
Alert ( "Запрос на установку ордера Sell не выполнен - код ошибки:" , GetLastError ());
return ;
}
}
}
}
if (TrailingStop> 0 )
{
if ( OrderSelect (tik)== true )
{
if ( ORDER_TYPE_BUY )
//if(OrderGetInteger(ORDER_TYPE_BUY)==true)
{
if (Bid- ORDER_PRICE_OPEN > _Point *(TrailingStop/ 10 ))
{
if ( ORDER_SL <Bid- _Point *(TrailingStop/ 10 ))
{
bool Ans=trade.OrderModify(tik, ORDER_PRICE_OPEN , NormalizeDouble (Bid- _Point *(TrailingStop/ 10 ), 5 ), ORDER_TP , ORDER_TIME_GTC , ORDER_TIME_EXPIRATION );
if (Ans== true )
{
Alert ( "Цена Stop Loss ордера успешно модифицирована." );
return ;
}
}
}
}
else
{
if (Bid- ORDER_PRICE_OPEN < _Point *- 1 *(TrailingStop/ 10 ))
{
if ( ORDER_SL >Bid- _Point *(TrailingStop/ 10 ))
{
bool Ans=trade.OrderModify(tik, ORDER_PRICE_OPEN , NormalizeDouble (Bid- _Point *(TrailingStop/ 10 ), 5 ), ORDER_TP , ORDER_TIME_GTC , ORDER_TIME_EXPIRATION );
if (Ans== true )
{
Alert ( "Цена Stop Loss ордера успешно модифицирована." );
return ;
}
}
}
}
}
}
return ;
}
voidOnStart()
{
int TrailingStop=50;
//--- модифицирует цену Stop Loss ордера на покупку №12345if(TrailingStop>0)
{
OrderSelect(12345,SELECT_BY_TICKET);
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
if(!res)
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
elsePrint("Цена Stop Loss ордера успешно модифицирована.");
}
}
}
}
Ich bin mir sicher, dass dies auf meine mangelnden Kenntnisse und den dadurch verlangsamten Übergang von 4 auf 5 zurückzuführen ist. Ich nehme jeden Vorschlag an, wie ich meine Fähigkeiten verbessern kann))))
Die Idee ist, einen Auftrag per Ticket auszuwählen, den Auftragstyp (Kaufen oder Verkaufen) zu wählen und dann diesen Typ zu verwenden, um zu prüfen, ob der aktuelle Auftragsstatus der Bedingung entspricht (aktueller Preis minus offener Preis), die größer sein sollte als der Preis von einem Pip multipliziert mit dem angegebenen Betrag (in meinem Code ist dies der Take-Profit-Preis geteilt durch 10). Wenn diese Bedingung erfüllt ist, sollten Sie darauf achten, dass der Stop-Loss-Kurs um den Wert eines Pips multipliziert mit dem angegebenen Wert unter dem aktuellen Kurs liegt. Wenn dies der Fall ist, ändert sich auch der Preis für den Stop-Loss.
Dieser Blödsinn ist also das Ergebnis von mangelndem Wissen und als Folge des lahmen Übergangs von 4 auf 5
Was Sie waren darauf hingewiesen, Bezeichner der Eigenschaften von Aufträgen und der Wert wird mit Hilfe von Bezeichnern und Funktionen OrderGetDouble , OrderGetInteger, etc. erhalten.
lewvik: Der Wert wird mit Hilfe der Bezeichner und Funktionen OrderGetDouble , OrderGetInteger usw. ermittelt.
Könnten wir ein kleines Beispiel haben, ich verstehe den Aufbau einfach nicht ganz, vielleicht wäre es besser: if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)?
StrangerNet: Könnten Sie mir ein kleines Beispiel geben, ich verstehe die Konstruktion nicht ganz, vielleicht wäre es korrekter: if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)?
Ich habe keine Ahnung - ich schreibe nicht in F5. Aber lassen Sie mich Ihnen eine Frage stellen: Was hindert Sie daran, das Ergebnis dieser Prüfung zu protokollieren?
artmedia70: Das kann ich Ihnen nicht sagen - ich schreibe nicht in A. Ich möchte jedoch eine Frage stellen: Was hindert Sie daran, das Ergebnis dieser Prüfung zu protokollieren?
und fliegt durch die gesamte Funktion, ohne sie zu betreten. Gleichzeitig wird die Variable tik global deklariert: ulong tik=0; - und ihr wird ein neuer Wert zugewiesen, wenn eine Antwort über die Auftragseinstellung empfangen wird: tik=mresult.order; - dieser Wert ändert sich beim Debuggen. Warum geht es nicht in den Zustand ein?
StrangerNet: Kann ich ein kleines Beispiel haben, ich verstehe nur den Aufbau nicht ganz, vielleicht ist das richtiger: if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)?
OrderSelect(tiket);//-- выбрать ордер по тикетуif(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)
{
}
Funktion if(OrderSelect(tik)==true) schreibt Fehler 4754 - Auftrag nicht gefunden, mit tik Wert in Debugging 42276230 gleich erstellt Auftragsnummer 42276230, was könnte der Fehler sein?
Hängen Sie entweder den gesamten Code an oder initialisieren Sie Ihre Variablen vor dem Code-Snippet. Man weiß nie, was man da in den Variablen hat, zum Beispiel in
Gesamtcode:
Der gesamte Code:
Was zum Teufel ist das?
Was zum Teufel ist das?
)))))))
Ich verwende MQL4 als Basis:
Ich bin mir sicher, dass dies auf meine mangelnden Kenntnisse und den dadurch verlangsamten Übergang von 4 auf 5 zurückzuführen ist. Ich nehme jeden Vorschlag an, wie ich meine Fähigkeiten verbessern kann))))
Die Idee ist, einen Auftrag per Ticket auszuwählen, den Auftragstyp (Kaufen oder Verkaufen) zu wählen und dann diesen Typ zu verwenden, um zu prüfen, ob der aktuelle Auftragsstatus der Bedingung entspricht (aktueller Preis minus offener Preis), die größer sein sollte als der Preis von einem Pip multipliziert mit dem angegebenen Betrag (in meinem Code ist dies der Take-Profit-Preis geteilt durch 10). Wenn diese Bedingung erfüllt ist, sollten Sie darauf achten, dass der Stop-Loss-Kurs um den Wert eines Pips multipliziert mit dem angegebenen Wert unter dem aktuellen Kurs liegt. Wenn dies der Fall ist, ändert sich auch der Preis für den Stop-Loss.
Dieser Blödsinn ist also das Ergebnis von mangelndem Wissen und als Folge des lahmen Übergangs von 4 auf 5
Der Wert wird mit Hilfe der Bezeichner und Funktionen OrderGetDouble , OrderGetInteger usw. ermittelt.
Könnten Sie mir ein kleines Beispiel geben, ich verstehe die Konstruktion nicht ganz, vielleicht wäre es korrekter: if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)?
Das kann ich Ihnen nicht sagen - ich schreibe nicht in A. Ich möchte jedoch eine Frage stellen: Was hindert Sie daran, das Ergebnis dieser Prüfung zu protokollieren?
Job)))))))))
Die Fehler wurden behoben, alles scheint dem Handbuch zu entsprechen:
Bei der Fehlersuche erreicht er die Bedingung
und fliegt durch die gesamte Funktion, ohne sie zu betreten. Gleichzeitig wird die Variable tik global deklariert: ulong tik=0; - und ihr wird ein neuer Wert zugewiesen, wenn eine Antwort über die Auftragseinstellung empfangen wird: tik=mresult.order; - dieser Wert ändert sich beim Debuggen. Warum geht es nicht in den Zustand ein?
Kann ich ein kleines Beispiel haben, ich verstehe nur den Aufbau nicht ganz, vielleicht ist das richtiger: if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)?