Dove ho fatto un errore. Perché ho una posizione allargata.
C'è un concetto chiamato netting. Secondo la filosofia del NETTING, tutti gli scambi unidirezionali aumentano la posizione, mentre quelli multidirezionali la chiudono, la diminuiscono o la invertono.
Khomtchenko:
Controllo per indicatore - se ci dovrebbe essere una posizione Buy, ma c'è una Sell, allora fai Buy.
Se traiamo una conclusione dalla linea, capiamo che con un Sell esistente una nuova posizione Buy chiuderà o taglierà la posizione esistente.
PS
A proposito, TP e SL in MT5 sono impostati in base all'ultimo trade, quindi anche loro dovrebbero essere monitorati...
Come posso cancellare correttamente tutti gli ordini con una certa modalità?
Ho due funzioni per questo, check_orders controlla gli ordini con una certa modalità, e remove_sl li elimina:
Il problema è che nel diario del mio EA, ottengo righe come questa:
2011.05.11 21:40:19 Trades '726238' : failed cancel order #4375237 buy 0.00 at 0.00000 [Invalid request] Cioè le richieste inutili vengono inviate al server commerciale con la richiesta di cancellare l'ordine che è già stato richiesto.
Dovrei scorrere l'elenco degli ordini dall'alto verso il basso, ad esempio
ЗЫ Если вы знаете инструмент то для поиска позиции совсем не нужно перебирать все позиции, достаточно воспользоваться вот этой функцией:
boolPositionSelect(
string symbol // имя инструмента
);
Grazie. Farò un tentativo.
A proposito, io uso un solo simbolo.
Secondo la filosofia di questo stesso NETTING, tutti i trade unidirezionali aumentano la posizione e i trade multidirezionali chiudono, diminuiscono o invertono.
Esattamente!
Concludiamo dalla linea che capiamo che con un Sell esistente un nuovo Buy chiuderà o taglierà una posizione esistente.
PS
A proposito, TP e SL in MT5 sono impostati in base all'ultimo trade, quindi anche loro dovrebbero essere monitorati...
Dalle sue parole, signorInteressante, capisco che ho capito tutto correttamente.
Sto usando gli stessi lotti. Sto usando gli stessi stop. Tutto è come dovrebbe essere. Ma c'è qualcosa che non va!
Ok. Ha promesso di fare due EA e mostrare la differenza. Lo farò io. Non voglio mettere il migliore là fuori perché tutti lo vedano.
Quindi, chi tra i rispettati esperti può inviarmi per email due EAs per la stessa strategia su mql4 e su mql5?
Ho solo bisogno di capire cosa sto sbagliando, tutto qui. Beh, le statistiche dei prezzi diversi non possono cambiare i risultati del test di 2-3 volte. Si tratta di programmazione.
Lizar,Renat,sergeev, AIUTATEMI. Posso darvi tutti gli esperti per rivedere il codice. L'Expert Advisor è semplice ma efficace. Posso ancora migliorarlo, ma l'ho semplificato al massimo, per rendere più chiara l'essenza del problema.
Mi scuso anche con tutti per essere stati intemperanti nelle loro affermazioni. Sono imbarazzato. Ma voglio MOLTO capire tutto!
//+------------------------------------------------------------------+//| M2H1mql5.mq5 |//| Copyright 2011, Yuriy V.Khomtchenko |//| mr.Khomtchenko@gmail.com |//+------------------------------------------------------------------+#property copyright "Copyright 2011, Yuriy V.Khomtchenko"#property link "mr.Khomtchenko@gmail.com"#property version "1.00"MqlRates price[2];
double m_buff_EMAs[];
double m_buff_EMAb[];
double Ask;
double Bid;
int N=2;
double m_handle_ema1, m_handle_ema3;
externdouble Lots = 0.1;
externint Period_MA1=4;
externint Period_MA3=21;
bool mm =0;
bool New_Bar=false;
intconst magic=102406;
double Mas0, Mab0, Mas1, Mab1;
double
StopLoss=200,
TakeProfit=3200;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---
m_handle_ema1=iMA(_Symbol,_Period,Period_MA1,0,MODE_EMA,PRICE_CLOSE);
m_handle_ema3=iMA(_Symbol,_Period,Period_MA3,0,MODE_EMA,PRICE_CLOSE);
//---return(0);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
GetIns();
if (!PositionSelect(_Symbol))
{
if(Mas0>Mab0 && Mas1<Mab1) OpenBuy(Lots,10,"EUR/USD (Buy)",102406);
if(Mas0<Mab0 && Mas1>Mab1) OpenSell(Lots,10,"EUR/USD (Sell)",102406);
}
if (PositionSelect(_Symbol)) TryToClose();
}
//+------------------------------------------------------------------+void GetIns()
{
CopyRates(_Symbol, _Period,0,2,price);
CopyBuffer(m_handle_ema1,0,0,N,m_buff_EMAs);
ArraySetAsSeries(m_buff_EMAs,true);
CopyBuffer(m_handle_ema3,0,0,N,m_buff_EMAb);
ArraySetAsSeries(m_buff_EMAb,true);
Mas0=m_buff_EMAs[0];
Mas1=m_buff_EMAs[1];
Mab0=m_buff_EMAb[0];
Mab1=m_buff_EMAb[1];
MqlTick last_tick;//Здесь будут храниться цены последнего пришедшего тикаSymbolInfoTick(_Symbol,last_tick);//заполняем структуру last_tick последними ценами текущего символа.
Ask=last_tick.ask;//Обновляем переменные Ask и Bid для дальнейшего использования
Bid=last_tick.bid;
return;
}
//Функция открытия длинной (Long) позиции. Указываем также значения переменных по умолчаниюint OpenBuy(double volume,int slippage=10,string comment="EUR/USD (Buy)",int magic0=102406)
{
MqlTradeRequest my_trade;//объявляем структуру типа MqlTradeRequest для формирования запросаMqlTradeResult my_trade_result;//в этой структуре будет ответ сервера на запрос.//далее заполняеем все НЕОБХОДИМЫЕ поля структуры запроса.
my_trade.action=TRADE_ACTION_DEAL;//Установить торговый ордер на немедленное совершение сделки с указанными //параметрами (поставить рыночный ордер)
my_trade.symbol=Symbol();//указываем в качестве валютной пары - текущую валютную пару //(ту, на которой запущен советник)
my_trade.volume=NormalizeDouble(volume,1);//размер лота
my_trade.price=NormalizeDouble(Ask,_Digits);//Цена, при достижении которой ордер должен быть исполнен. //В нашем случае для TRADE_ACTION_DEAL это текущая цена и ее, согласно инструкции указывать не обязательно.
my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);//стоплосс ордера (цена при которой следует закрыть //убыточную сделку)
my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);//тейкпрофит (цена при которой следует закрыть// прибыльную сделку)
my_trade.deviation=slippage;//проскальзывание в пунктах (при тестировании особой роли не играет, т.к. //проскальзывания не бывает на тестах)
my_trade.type=ORDER_TYPE_BUY;//тип рыночного ордера (покупаем)
my_trade.type_filling=ORDER_FILLING_AON;//Указываем как исполнять ордер. (All Or Nothing - все или ничего) //Сделка может быть совершена исключительно в указанном объеме и по цене равной или лучше указанной в ордере.
my_trade.comment=comment;//комментарий ордера
my_trade.magic=magic;//магическое число ордераResetLastError();//обнуляем код последней ошибки if(OrderSend(my_trade,my_trade_result))//отправляем запрос на открытие позиции. При этом проверяем //успешно ли прошла отправка запроса
{
// Если сервер принял ордер то смортрим на результат Print("Код результата операции - ",my_trade_result.retcode);
}
else
{
//Сервер не принял ордер в нем есть ошибки, выводим их в журналPrint("Код результата операции - ",my_trade_result.retcode);
Print("Ошибка открытия ордера = ",GetLastError());
}
return(0);// Выходим из функции открытия ордера
}
//функция открытия короткой (Short) позиции. Аналогична функции открытия длинной позиции.int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)
{
MqlTradeRequest my_trade;
MqlTradeResult my_trade_result;
my_trade.action=TRADE_ACTION_DEAL;
my_trade.symbol=Symbol();
my_trade.volume=NormalizeDouble(volume,1);
my_trade.price=NormalizeDouble(Bid,_Digits);
my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits);
my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);
my_trade.deviation=slippage;
my_trade.type=ORDER_TYPE_SELL;
my_trade.type_filling=ORDER_FILLING_AON;
my_trade.comment=comment;
my_trade.magic=magic;
ResetLastError();
if(OrderSend(my_trade,my_trade_result))
{
Print("Код результата операции - ",my_trade_result.retcode);
}
else
{
Print("Код результата операции - ",my_trade_result.retcode);
Print("Ошибка открытия ордера = ",GetLastError());
}
return(0);
}
int TryToClose()
{
if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
if(Mas0<Mab0 && Mas1>Mab1) OpenSell(Lots,10,"EUR/USD (Sell)",102406);
if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
if(Mas0>Mab0 && Mas1<Mab1) OpenBuy(Lots,10,"EUR/USD (Buy)",102406);
return(0);
}
Il problema è che nel diario di EA appaiono queste righe:
2011.05.11 21:40:19 Trades '726238' : failed cancel order #4375237 buy 0.00 at 0.00000 [Invalid request] Cioè vengono inviate richieste inutili al server commerciale per rimuovere l'ordine che era già stato richiesto.
Lei ha consigliato quanto segue:
Dovete scorrere l'elenco degli ordini dall'alto verso il basso, per esempio così:
Ho provato a fare come hai detto tu, ma il problema rimane - l'ordine in sospeso viene cancellato per primo, poi viene inviata un'altra richiesta per cancellare lo stesso ordine. Ecco un esempio delle linee di log:
2011.05.12 16:42:57 Trades '726238' : cancella l'ordine #4388299 buy stop 0.02 EURUSD a 1.41700 fatto - cancellato con successo l'ordine 2011.05.12 16:42:57 Trades '726238' : annulla l'ordine #4388299 buy stop 0.02 EURUSD a 1.41700 - Un'altra richiesta è stata inviata 2011.05.12 16:42:58 Trades '726238' : failed cancel order #4388299 buy 0.00 at 0.00000 [Invalid request] - era buy per qualche motivo.
Questo non succede sempre, ma a volte, e non influisce sul funzionamento dell'Expert Advisor. Voglio solo fare tutto correttamente, non caricare il server commerciale con richieste vuote, e risolvere il problema.
Grazie per le vostre risposte e la vostra disponibilità ad aiutare.
Dove ho fatto un errore. Perché ho una posizione allargata.
C'è un concetto chiamato netting. Secondo la filosofia del NETTING, tutti gli scambi unidirezionali aumentano la posizione, mentre quelli multidirezionali la chiudono, la diminuiscono o la invertono.
Se traiamo una conclusione dalla linea, capiamo che con un Sell esistente una nuova posizione Buy chiuderà o taglierà la posizione esistente.
PS
A proposito, TP e SL in MT5 sono impostati in base all'ultimo trade, quindi anche loro dovrebbero essere monitorati...
Come posso cancellare correttamente tutti gli ordini con una certa modalità?
Ho due funzioni per questo, check_orders controlla gli ordini con una certa modalità, e remove_sl li elimina:
Il problema è che nel diario del mio EA, ottengo righe come questa:
2011.05.11 21:40:19 Trades '726238' : failed cancel order #4375237 buy 0.00 at 0.00000 [Invalid request]
Cioè le richieste inutili vengono inviate al server commerciale con la richiesta di cancellare l'ordine che è già stato richiesto.
Dovrei scorrere l'elenco degli ordini dall'alto verso il basso, ad esempio
ЗЫ Если вы знаете инструмент то для поиска позиции совсем не нужно перебирать все позиции, достаточно воспользоваться вот этой функцией:
Grazie. Farò un tentativo.
A proposito, io uso un solo simbolo.
Secondo la filosofia di questo stesso NETTING, tutti i trade unidirezionali aumentano la posizione e i trade multidirezionali chiudono, diminuiscono o invertono.
Esattamente!
Concludiamo dalla linea che capiamo che con un Sell esistente un nuovo Buy chiuderà o taglierà una posizione esistente.
PS
A proposito, TP e SL in MT5 sono impostati in base all'ultimo trade, quindi anche loro dovrebbero essere monitorati...
Dalle sue parole, signorInteressante , capisco che ho capito tutto correttamente.
Sto usando gli stessi lotti. Sto usando gli stessi stop. Tutto è come dovrebbe essere. Ma c'è qualcosa che non va!
Ok. Ha promesso di fare due EA e mostrare la differenza. Lo farò io. Non voglio mettere il migliore là fuori perché tutti lo vedano.
Quindi, chi tra i rispettati esperti può inviarmi per email due EAs per la stessa strategia su mql4 e su mql5?
Ho solo bisogno di capire cosa sto sbagliando, tutto qui. Beh, le statistiche dei prezzi diversi non possono cambiare i risultati del test di 2-3 volte. Si tratta di programmazione.
Lizar,Renat,sergeev, AIUTATEMI. Posso darvi tutti gli esperti per rivedere il codice. L'Expert Advisor è semplice ma efficace. Posso ancora migliorarlo, ma l'ho semplificato al massimo, per rendere più chiara l'essenza del problema.
Mi scuso anche con tutti per essere stati intemperanti nelle loro affermazioni. Sono imbarazzato. Ma voglio MOLTO capire tutto!
Bisogna passare attraverso l'elenco degli ordini dall'alto verso il basso, ad esempio così:
Non aiuta, apparentemente l'ordine viene cancellato con successo e poi viene inviata un'altra richiesta:
2011.05.12 16:42:57 Trades '726238' : annulla l'ordine #4388299 buy stop 0.02 EURUSD a 1.41700 fatto
2011.05.12 16:42:57 Trades '726238' : annulla l'ordine #4388299 buy stop 0.02 EURUSD a 1.41700
2011.05.12 16:42:58 Trades '726238' : failed cancel order #4388299 buy 0.00 at 0.00000 [Invalid request] - already a buy while buy stop was
simile, ma su mql4:
Beh, guarda e confronta. Ho sbagliato da qualche parte... La differenza è sostanziale.
Non aiuta, apparentemente l'ordine viene cancellato con successo e poi viene inviata un'altra richiesta:
2011.05.12 16:42:57 Trades '726238' : annulla l'ordine #4388299 buy stop 0.02 EURUSD a 1.41700 fatto
2011.05.12 16:42:57 Trades '726238' : annulla l'ordine #4388299 buy stop 0.02 EURUSD a 1.41700
2011.05.12 16:42:58 Trades '726238' : failed cancel order #4388299 buy 0.00 at 0.00000 [Invalid request] - already a buy while buy stop was
Mi vergogno di ammettere che non ho ancora imparato l'arte della telepatia.
Ripeterò la domanda:
Come posso cancellare correttamente tutti gli ordini con un certo mag?
Ho due funzioni per questo, check_orders controlla gli ordini con una certa modalità e remove_sl li rimuove:
Il problema è che nel diario di EA appaiono queste righe:
2011.05.11 21:40:19 Trades '726238' : failed cancel order #4375237 buy 0.00 at 0.00000 [Invalid request]
Cioè vengono inviate richieste inutili al server commerciale per rimuovere l'ordine che era già stato richiesto.
Lei ha consigliato quanto segue:
Dovete scorrere l'elenco degli ordini dall'alto verso il basso, per esempio così:
Ho provato a fare come hai detto tu, ma il problema rimane - l'ordine in sospeso viene cancellato per primo, poi viene inviata un'altra richiesta per cancellare lo stesso ordine. Ecco un esempio delle linee di log:
2011.05.12 16:42:57 Trades '726238' : cancella l'ordine #4388299 buy stop 0.02 EURUSD a 1.41700 fatto - cancellato con successo l'ordine
2011.05.12 16:42:57 Trades '726238' : annulla l'ordine #4388299 buy stop 0.02 EURUSD a 1.41700 - Un'altra richiesta è stata inviata
2011.05.12 16:42:58 Trades '726238' : failed cancel order #4388299 buy 0.00 at 0.00000 [Invalid request] - era buy per qualche motivo.
Questo non succede sempre, ma a volte, e non influisce sul funzionamento dell'Expert Advisor. Voglio solo fare tutto correttamente, non caricare il server commerciale con richieste vuote, e risolvere il problema.
Grazie per le vostre risposte e la vostra disponibilità ad aiutare.