Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
https://www.mql5.com/ru/forum/97557/page4#comment_2891988
Forum sul trading, sistemi di trading automatico e test di strategia
Come lavorare correttamente in MT5 con OrderSend
fxsaber, 2016.11.14 20:20
Gli script hanno un problema con questo.Spiacente, non ho voglia di occuparmi dei tuoi script
Aggiunto da
Ma c'è un modo per uscirne.
Poiché la funzione OrderrSend() è sincrona, dopo aver ricevuto l'ordine
assicurarsi che la storia sia sincronizzata in OnTradeTransaction()
// Expert TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_ORDER_UPDATE:
switch(trans.order_state)
{
case ORDER_STATE_PLACED:
if(order_ticket==trans.order)
{
Print(__FUNCTION__," Order plased done. Ticket = ",trans.order);
if(order_ticket>0)
{
if(OrderSelect(order_ticket))
{
//Ордер синхронизирован с историей
}
else
{
Print(__FUNCTION__," Order not select! Ticket = ",trans.order);
}
}
else
{
Print(__FUNCTION__," Wrong order ticket = ",trans.order);
}
}
break;
}
break;
}
}
E non si balla!
Non si balla!
Forum sul trading, sistemi di trading automatico e test di strategia
Come lavorare correttamente in MT5 con OrderSend
fxsaber, 2016.11.10 10:00
Si noti che questo è uno script e non ci può essere alcun Event-Over. L'unica via d'uscita è uno stupido Sonno.
Se riscrivete questo script con SB, non cambierà nulla.
Si può scherzare con Sleep come si vuole....
Perché ripetere la stessa cosa che è già stata suggerita ed espressa prima da altri?
Il thread dice tutto sui possibili problemi con OnTradeTransaction. In particolare, riguarda il funzionamento di più Expert Advisors contemporaneamente.
La gente fa le stampelle, non significa che non conosce la documentazione e non sa come usare le funzioni.
OnTrade e OnTradeTransaction sono stati sviluppati esattamente per questo scopo. Quando hanno iniziato, gli sviluppatori pensavano che sarebbe stato idiota gestire più di un Expert Advisor simultaneamente in un conto.
Beh, su questo si sbagliavano.
Prova a scrivere la seguente funzione nel tuo Expert Advisor
Perché ripetere la stessa cosa che è già stata suggerita ed espressa prima da altri?
Il thread dice tutto sui possibili problemi con OnTradeTransaction. In particolare, riguarda il funzionamento di più Expert Advisors contemporaneamente.
La gente fa le stampelle, non significa che non conosce la documentazione e non sa come usare le funzioni.
OnTrade e OnTradeTransaction sono stati sviluppati esattamente per questo scopo. Quando hanno iniziato, gli sviluppatori pensavano che sarebbe stato idiota gestire più di un Expert Advisor simultaneamente in un conto.
Beh, su questo si sbagliavano.
Prova a scrivere la seguente funzione nel tuo Expert Advisor
Attualmente, ho 41 Expert Advisors che lavorano su un conto reale (in un terminale) che insieme durante una giornata di trading
Hanno impostato 2000 ordini di apertura e chiusura delle posizioni e non sto riscontrando alcuna difficoltà!
Aggiunto
Per quanto riguarda la funzionalità che abbiamo, dovrebbe essere basata su ciò che abbiamo e non su ciò di cui abbiamo "bisogno".
Gli sviluppatori, se possibile, correggono i bug e gli errori, tenendo conto dei desideri di
utenti (anche se molto lentamente).
Penso che presto si occuperanno anche di OederSend().
Ho 41 Expert Advisors sul mio conto reale (in un terminale) che lavorano tutti insieme durante una giornata di trading.
Impostano 2000 ordini, aprono e chiudono posizioni e non ho nessun problema!
Questo si chiama andare fuori tema.
Quando si tratta anche della logica più semplice.
Forum sul trading, sistemi di trading automatico e strategie di trading di prova
Come lavorare correttamente in MT5 con OrderSend
fxsaber, 2016.11.15 13:30
Prova a scrivere la seguente funzione nel tuo EA
#property strict
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
void Func( const string &Symbols[] )
{
const int Total = ArraySize(Symbols);
for (int i = 0; i < Total; i++)
{
const double Price = SymbolInfoDouble(Symbols[i], SYMBOL_ASK);
const int digits = (int)SymbolInfoInteger(Symbols[i], SYMBOL_DIGITS);
if (!OrderSelect(OrderSend(Symbols[i], OP_BUY, 1, Price, 100, 0, 0, DoubleToString(Price, digits)), SELECT_BY_TICKET) ||
(NormalizeDouble(Price - OrderOpenPrice(), digits) != 0)) // если не получилось открыть или есть проскальзывание - выходим
break;
}
}
void OnStart() // OnTick
{
const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDCAD", "USDJPY"};
Func(Symbols);
}
E qualcuno aspetta il mana dagli sviluppatori.
Ho già detto che siete liberi di rigirarla come volete (tutti hanno questo diritto).
Ho già detto che siete liberi di torcere come volete (tutti hanno questo diritto).
è stato molto tempo fa, ma mi ricordo questo ragazzo, beh, questofxsaber ha fatto meraviglie,
i suoi codici sono ancora conservati nel codebase di MT4, il suo codice per leggere i siti su WinInet
è ancora usato da molti programmatori...
e quindi, mi sembra, non è un pervertito...
const bool IsTester = (::MQLInfoInteger(MQL_TESTER) || ::MQLInfoInteger(MQL_OPTIMIZATION) ||
::MQLInfoInteger(MQL_VISUAL_MODE) || ::MQLInfoInteger(MQL_FRAME_MODE));
bool Waiting( const bool FlagInit = false )
{
static ulong StartTime = 0;
if (FlagInit)
StartTime = ::GetMicrosecondCount();
const bool Res = (::GetMicrosecondCount() - StartTime < OrderSend_MaxPause);
if (Res)
::Sleep(0);
return(Res);
}
bool EqualPrices( const double Price1, const double Price2, const int digits)
{
return(::NormalizeDouble(Price1 - Price2, digits) == 0);
}
#define WHILE(A) while (!(Res = (A)) && Waiting())
bool OrderSendSync( const MqlTradeRequest &Request, MqlTradeResult &Result )
{
bool Res = ::OrderSend(Request, Result);
if (Res && !IsTester && (Result.retcode < TRADE_RETCODE_ERROR) && (OrderSend_MaxPause > 0))
{
Res = (Result.retcode == TRADE_RETCODE_DONE);
Waiting(true);
if (Request.action == TRADE_ACTION_DEAL)
{
WHILE(::HistoryOrderSelect(Result.order))
;
Res = Res && (((ENUM_ORDER_STATE)::HistoryOrderGetInteger(Result.order, ORDER_STATE) == ORDER_STATE_FILLED) ||
((ENUM_ORDER_STATE)::HistoryOrderGetInteger(Result.order, ORDER_STATE) == ORDER_STATE_PARTIAL));
if (Res)
WHILE(::HistoryDealSelect(Result.deal))
;
}
else if (Request.action == TRADE_ACTION_PENDING)
{
if (Res)
WHILE(::OrderSelect(Result.order))
;
else
{
WHILE(::HistoryOrderSelect(Result.order))
;
Res = false;
}
}
else if (Request.action == TRADE_ACTION_SLTP)
{
if (Res)
{
bool EqualSL = false;
bool EqualTP = false;
const int digits = (int)::SymbolInfoInteger(Request.symbol, SYMBOL_DIGITS);
if ((Request.position == 0) ? ::PositionSelect(Request.symbol) : ::PositionSelectByTicket(Request.position))
{
EqualSL = EqualPrices(::PositionGetDouble(POSITION_SL), Request.sl, digits);
EqualTP = EqualPrices(::PositionGetDouble(POSITION_TP), Request.tp, digits);
}
WHILE((EqualSL && EqualTP))
if ((Request.position == 0) ? ::PositionSelect(Request.symbol) : ::PositionSelectByTicket(Request.position))
{
EqualSL = EqualPrices(::PositionGetDouble(POSITION_SL), Request.sl, digits);
EqualTP = EqualPrices(::PositionGetDouble(POSITION_TP), Request.tp, digits);
}
}
}
else if (Request.action == TRADE_ACTION_MODIFY)
{
if (Res)
{
bool EqualSL = false;
bool EqualTP = false;
const int digits = (int)::SymbolInfoInteger(Request.symbol, SYMBOL_DIGITS);
if (::OrderSelect(Result.order))
{
EqualSL = EqualPrices(::OrderGetDouble(ORDER_SL), Request.sl, digits);
EqualTP = EqualPrices(::OrderGetDouble(ORDER_TP), Request.tp, digits);
}
WHILE((EqualSL && EqualTP))
if (::OrderSelect(Result.order))
{
EqualSL = EqualPrices(::OrderGetDouble(ORDER_SL), Request.sl, digits);
EqualTP = EqualPrices(::OrderGetDouble(ORDER_TP), Request.tp, digits);
}
}
}
else if (Request.action == TRADE_ACTION_REMOVE)
if (Res)
WHILE(::HistoryOrderSelect(Result.order))
;
}
return(Res);
}
#undef WHILE