Saluti. Ho guardato il video competente "Da MQL4 a MQL5 - come riscrivere gli EA per Metatrader 5". Molte grazie all'autore. Ho deciso di provare io stesso. Ho deciso di provare io stesso. L'idea è la seguente: 1. Ho impostato dtriger = 1 negli input - Buy si apre. 2. Ho impostato dtriger = -1 - Vendere si apre. 3. Ho impostato dtriger = 0 - tutti quelli aperti sono chiusi. Ho letto nelle FAQ che in MT5 non è possibile tenere posizioni opposte, e io li ho. Domanda: come prescrivere correttamente la chiusura di una posizione esistente La domanda è: come registrare correttamente la chiusura di una posizione esistente all'apertura di una posizione inversa? Molte grazie.
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>
CPositionInfo o_position;
CTrade o_trade;
CSymbolInfo o_symbol;
COrderInfo o_order;
inputint triger = 0;
inputdouble StartLot = 0.01;
inputdouble lpos_volume = 1.0;
inputint Step = 10;
inputint MagicNumber = 12345; // Magic nuaberinputint Slippage = 30; // slippageint dtriger;
int dStep;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
dStep = Step ;
dtriger = triger ;
if (!o_symbol.Name(Symbol()))
return(INIT_FAILED);
RefreshRates();
o_trade.SetExpertMagicNumber(MagicNumber) ;
if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
{
o_trade.SetTypeFilling(ORDER_FILLING_FOK);
}
elseif (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
{
o_trade.SetTypeFilling(ORDER_FILLING_IOC);
}
else
{
o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
}
o_trade.SetDeviationInPoints(Slippage);
if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
{
dStep = 10 ;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
datetime lpos_time = 0;
double lpos_price_open = 0.0;
ENUM_POSITION_TYPE lpos_type = -1;
int pos_count = 0;
double sum_profit = 0;
for (int i = PositionsTotal() - 1; i>=0; i--)
{
if (o_position.SelectByIndex(i))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
if (o_position.Time() > lpos_time)
{
lpos_time = o_position.Time(); //OrderOpenTime();
lpos_price_open = o_position.PriceOpen(); //OrderOpenPrice();
lpos_type = o_position.PositionType() ; //OrderTipe();
}
pos_count++;
sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
}
}
}
// Считаем кол-во отложенных ордеровint stop_count=0;
for (int i=OrdersTotal()-1; i >=0; i--)
{
if (o_order.SelectByIndex(i))
{
if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
stop_count++;
}
}
if (!RefreshRates())
return ;
if(dtriger == 0 )
{
CloseAll();
return;
}
// + ----- Откраваем Первый ордер ++++++++++if (pos_count == 0 && stop_count == 0 )
{
if ( dtriger == -1 && lpos_type != POSITION_TYPE_SELL)
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L 11111
}
if ( dtriger == 1 && lpos_type != POSITION_TYPE_BUY )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y 11111
}
}
// + ----- Переворот ++++++++++++++++++++++++++++ if (pos_count>0)
{
if(lpos_type == POSITION_TYPE_BUY )
{
if ( dtriger == -1 )
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L +++++
}
}
if (lpos_type==POSITION_TYPE_SELL )
{
if ( dtriger == 1 )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y +++++
}
}
}
if(pos_count>0 && stop_count>0)
DeleteStopOrders() ;
}
//-----------------------------------------------------------bool RefreshRates()
{
if (!o_symbol.RefreshRates())
return(false) ;
if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
return(false);
return(true);
}
//--- --------------------------------------------------------- bool IsFillingTypeAllowed (string symbol, int fill_type)
{
int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
return((filling && fill_type) == fill_type) ;
}
// -------------------------------------------------- void CloseAll()
{
for (int index = PositionsTotal()-1; index >=0; index--)
{
if (o_position.SelectByIndex(index))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
o_trade.PositionClose(o_position.Ticket());
}
}
}
}
//----------------------------------------------------------- // Delete all pending orders//-------------------------------------void DeleteStopOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i-- )
{
if (o_order.SelectByIndex(i))
if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
o_trade.OrderDelete(o_order.Ticket());
}
}
//+------------------------------------------------------------------+
Saluti. Ho guardato l'utile clip "Da MQL4 a MQL5 - come riscrivere gli EA per Metatrader 5". Vorrei congratularmi con l'autore. Ho deciso di provare io stesso. Ho deciso di provare io stesso. La mia idea è la seguente: 1. Ho impostato dtriger = 1 - apre Buy. 2. Ho impostato dtriger = -1 - Vendere si apre. 3. Ho impostato dtriger = 0 - tutti quelli aperti sono chiusi. Ho letto nelle FAQ che in MT5 non è possibile tenere posizioni opposte, e io li ho. Domanda: Come posso prescrivere correttamente la chiusura di una posizione aperta La domanda è: come registrare correttamente la chiusura di una posizione esistente all'apertura di una posizione inversa? Molte grazie.
Devi essere stato molto disattento quando hai letto la scheda informativa.
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
1. dtriger = 1 - Buy apre. 2. dtriger = -1 - Sell apre. 3. dtriger = 0 - tutti gli aperti sono chiusi.
L'Expert Advisor dovrebbe fare quanto segue:
se hai bisogno di aprire BUY - devi prima chiudere SELL (emetti un comando per chiudere le posizioni SELL - non importa se ci sono o no)
se avete bisogno di aprire SELL - allora prima dovete chiudere BUY (verrà emesso un comando di chiusura delle posizioni BUY, non importa se ci sono o no)
se il cliente ha bisogno di chiudere tutto - allora basta chiudere tutte le posizioni (non importa se comprano o vendono)
Due algoritmi sono necessari per l'implementazione (il numero magico contribuisce anche qui) - può essere disabilitato.
//+------------------------------------------------------------------+//| Close positions |//+------------------------------------------------------------------+void ClosePositions(constENUM_POSITION_TYPE pos_type)
{
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positionsif(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
if(m_position.PositionType()==pos_type) // gets the position type
m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
}
и
//+------------------------------------------------------------------+//| Close all positions |//+------------------------------------------------------------------+void CloseAllPositions(void)
{
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positionsif(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
}
L'idea generale è di fare un ciclo di tutte le posizioni daPositionsTotal()-1 a 0. È da PositionsTotal()-1 a 0, non da zero a PositionsTotal()-1. Questo è importante.
Inoltre un consiglio: quando si lavora in MetaTrader 5, un ordine è un ordine rimosso. Perciò si raccomanda vivamente di non tirare fuori la parola "ordine" in questa fase iniziale, per non creare confusione nella vostra mente.
Vladimir Karputov: Inoltre un consiglio: quando si lavora in MetaTrader 5, un ordine è un ordine rimosso. Perciò si raccomanda vivamente di non ricordare nemmeno la parola "ordine" all'inizio, per non creare confusione nella vostra mente.
Ci sono anche ordini di mercato Buy e Sell, così come gli ordini CloseBy.
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Saluti. Ho guardato il video competente "Da MQL4 a MQL5 - come riscrivere gli EA per Metatrader 5".
Molte grazie all'autore. Ho deciso di provare io stesso. Ho deciso di provare io stesso. L'idea è la seguente:
1. Ho impostato dtriger = 1 negli input - Buy si apre.
2. Ho impostato dtriger = -1 - Vendere si apre.
3. Ho impostato dtriger = 0 - tutti quelli aperti sono chiusi.
Ho letto nelle FAQ che in MT5 non è possibile tenere posizioni opposte,
e io li ho.
Domanda: come prescrivere correttamente la chiusura di una posizione esistente
La domanda è: come registrare correttamente la chiusura di una posizione esistente all'apertura di una posizione inversa?
Molte grazie.
Saluti. Ho guardato l'utile clip "Da MQL4 a MQL5 - come riscrivere gli EA per Metatrader 5".
Vorrei congratularmi con l'autore. Ho deciso di provare io stesso. Ho deciso di provare io stesso. La mia idea è la seguente:
1. Ho impostato dtriger = 1 - apre Buy.
2. Ho impostato dtriger = -1 - Vendere si apre.
3. Ho impostato dtriger = 0 - tutti quelli aperti sono chiusi.
Ho letto nelle FAQ che in MT5 non è possibile tenere posizioni opposte,
e io li ho.
Domanda: Come posso prescrivere correttamente la chiusura di una posizione aperta
La domanda è: come registrare correttamente la chiusura di una posizione esistente all'apertura di una posizione inversa?
Molte grazie.
Devi essere stato molto disattento quando hai letto la scheda informativa.
Riferimento:Principi generali - Operazioni commerciali.
In conclusione: MetaTrader 5 ha entrambi isistemi di Netting e Hedging.
Io formulerei il suo compito in modo diverso:
1. dtriger = 1 - Buy apre.
2. dtriger = -1 - Sell apre.
3. dtriger = 0 - tutti gli aperti sono chiusi.
L'Expert Advisor dovrebbe fare quanto segue:
Due algoritmi sono necessari per l'implementazione (il numero magico contribuisce anche qui) - può essere disabilitato.
и
L'idea generale è di fare un ciclo di tutte le posizioni daPositionsTotal()-1 a 0. È da PositionsTotal()-1 a 0, non da zero a PositionsTotal()-1. Questo è importante.
Inoltre un consiglio: quando si lavora in MetaTrader 5, un ordine è un ordine rimosso. Perciò si raccomanda vivamente di non ricordare nemmeno la parola "ordine" all'inizio, per non creare confusione nella vostra mente.
Ci sono anche ordini di mercato Buy e Sell, così come gli ordini CloseBy.
Grazie mille, proprio come la musica.
Grazie mille, proprio come la musica.
Beh, se volete essere così gentili, di più allora.
Ho inserito le voci e prescritto un pre-close, ma di nuovo gli ordini sono appesi lì e lì.
Beh, se volete essere così gentili, di più allora.
Ho inserito le voci e prescritto un pre-close, ma di nuovo ci sono ordini sospesi qua e là.
Grazie mille, proprio come le note.
Qual è il segnale di apertura? Perché il codice non è completo - solo posizioni di chiusura, ma ho anche bisogno di aprire posizioni...
Comando commerciale.mq5
#proprietà versione "1.000"
Finora esegue solo tre azioni: