#define EXPERT_MAGIC 123456 #define OFFSET 50 // scostamento dal prezzo corrente per effettuare l'ordine, in punti #define DIRECTION ORDER_TYPE_BUY_LIMIT // tipo di ordine #define VOLUME 1.0 // volume #define DEVIATION 2 // deviazione consentita dal prezzo //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //-- dichiarare e inizializzare la richiesta di trade, il risultato e le variabili MqlTradeRequest request={}; MqlTradeResult result ={}; double order_price=0; //-- parametri di immissione dell'ordine pendente request.action = TRADE_ACTION_PENDING; // tipo di operazione di trading request.symbol = _Symbol; // simbolo request.volume = VOLUME; // volume request.deviation = DEVIATION; // deviazione consentita dal prezzo request.magic = EXPERT_MAGIC; // MagicNumber dell'ordine //-- controllo tipo di operazione switch(DIRECTION) { case ORDER_TYPE_BUY_LIMIT : request.type = ORDER_TYPE_BUY_LIMIT; // tipo di ordine order_price = SymbolInfoDouble(_Symbol, SYMBOL_ASK)-OFFSET*_Point;// prezzo di apertura request.price= NormalizeDouble(order_price, _Digits); // prezzo di apertura normalizzato break; case ORDER_TYPE_SELL_LIMIT : request.type = ORDER_TYPE_SELL_LIMIT; // tipo di ordine order_price = SymbolInfoDouble(_Symbol, SYMBOL_BID)+OFFSET*_Point;// prezzo di apertura request.price= NormalizeDouble(order_price,_Digits); // prezzo di apertura normalizzato break; case ORDER_TYPE_BUY_STOP : request.type = ORDER_TYPE_BUY_STOP; // tipo di ordine order_price = SymbolInfoDouble(_Symbol, SYMBOL_ASK)+OFFSET*_Point;// prezzo di apertura request.price= NormalizeDouble(order_price,_Digits); // prezzo di apertura normalizzato break; case ORDER_TYPE_SELL_STOP : request.type = ORDER_TYPE_SELL_STOP; // tipo di ordine order_price = SymbolInfoDouble(_Symbol, SYMBOL_BID)-OFFSET*_Point;// prezzo di apertura request.price= NormalizeDouble(order_price,_Digits); // prezzo di apertura normalizzato break; default: // se viene selezionato l'ordine non in sospeso o StopLimit Alert("This example is only for placing pending orders BuyLimit, SellLimit, BuyStop and SellStop"); break; } //--- inviare una richiesta. Se l'invio di una richiesta fallisce, visualizzare il codice di errore e completare l'operazione if(!OrderSend(request, result)) { Print("OrderSend error ", GetLastError()); return; } //--- visualizzare i dati dell'operazione PrintFormat("Trade request result: retcode=%u, order=%I64u", result.retcode, result.order); //--- ottenere il ticket dell'ordine dal risultato dell'operazione di trade e selezionare l'ordine per ticket ulong ticket=result.order; ResetLastError(); if(!OrderSelect(ticket)) { PrintFormat("OrderSelect(%I64u) failed. Error %d", ticket, GetLastError()); return; } //--- visualizzare i dati dell'ordine, selezionato per ticket, nel journal ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); long time = OrderGetInteger(ORDER_TIME_SETUP_MSC); double price = OrderGetDouble(ORDER_PRICE_OPEN); double volume= OrderGetDouble(ORDER_VOLUME_CURRENT); string symbol= OrderGetString(ORDER_SYMBOL); int digits= (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS); PrintFormat("Current selected order: %s %.2f %s #%I64u at %.*f, %s", symbol, volume, OrderTypeDescription(type), ticket, digits, price, TimeMscToString(time)); /* risultato: Trade request result: retcode=10009, order=2811006719 Current selected order: EURUSD 1.00 Buy Limit #2811006719 at 1.10550, 2024.09.04 10:38:28.563 */ } //+------------------------------------------------------------------+ //| Restituisce il tempo con millisecondi | //+------------------------------------------------------------------+ string TimeMscToString(const long time_msc, int flags=TIME_DATE|TIME_MINUTES|TIME_SECONDS) { return(TimeToString(time_msc/1000, flags) + "." + IntegerToString(time_msc %1000, 3, '0')); } //+------------------------------------------------------------------+ //| Restituire la descrizione del tipo di ordine | //+------------------------------------------------------------------+ string OrderTypeDescription(const ENUM_ORDER_TYPE type) { switch(type) { case ORDER_TYPE_BUY : return("Buy"); case ORDER_TYPE_SELL : return("Sell"); case ORDER_TYPE_BUY_LIMIT : return("Buy Limit"); case ORDER_TYPE_SELL_LIMIT : return("Sell Limit"); case ORDER_TYPE_BUY_STOP : return("Buy Stop"); case ORDER_TYPE_SELL_STOP : return("Sell Stop"); case ORDER_TYPE_BUY_STOP_LIMIT : return("Buy Stop Limit"); case ORDER_TYPE_SELL_STOP_LIMIT : return("Sell Stop Limit"); default : return("Unknown order type"); } } |