#define EXPERT_MAGIC 123456
#define OFFSET 50 // offset from the current price to place the order, in points
#define DIRECTION ORDER_TYPE_BUY_LIMIT // order type
#define VOLUME 1.0 // volume
#define DEVIATION 2 // allowed deviation from the price
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수 |
//+------------------------------------------------------------------+
void OnStart()
{
//-- 거래 요청, 결과 및 변수를 선언하고 초기화
MqlTradeRequest request={};
MqlTradeResult result ={};
double order_price=0;
//--- 펜딩 주문 접수 매개 변수들
request.action = TRADE_ACTION_PENDING; // 주문 동작 유형
request.symbol = _Symbol; // 심볼
request.volume = VOLUME; // 볼륨
request.deviation = DEVIATION; // 가격으로 부터 허용된 편차
request.magic = EXPERT_MAGIC; // 주문 매직넘버
//--- 동작 유형 확인
switch(DIRECTION)
{
case ORDER_TYPE_BUY_LIMIT :
request.type = ORDER_TYPE_BUY_LIMIT; // 주문 유형
order_price = SymbolInfoDouble(_Symbol, SYMBOL_ASK)-OFFSET*_Point;// 시가
request.price= NormalizeDouble(order_price, _Digits); // 노멀라이즈된 주문 가격
break;
case ORDER_TYPE_SELL_LIMIT :
request.type = ORDER_TYPE_SELL_LIMIT; // 주문 유형
order_price = SymbolInfoDouble(_Symbol, SYMBOL_BID)+OFFSET*_Point;// 시가
request.price= NormalizeDouble(order_price,_Digits); // 노멀라이즈된 시가
break;
case ORDER_TYPE_BUY_STOP :
request.type = ORDER_TYPE_BUY_STOP; // 주문 유형
order_price = SymbolInfoDouble(_Symbol, SYMBOL_ASK)+OFFSET*_Point;// 시가
request.price= NormalizeDouble(order_price,_Digits); // 노멀라이즈된 시가
break;
case ORDER_TYPE_SELL_STOP :
request.type = ORDER_TYPE_SELL_STOP; // 주문 유형
order_price = SymbolInfoDouble(_Symbol, SYMBOL_BID)-OFFSET*_Point;// 시가
request.price= NormalizeDouble(order_price,_Digits); // 노멀라이즈된 시가
break;
default: // 만약 펜딩이 아니 주문 혹은 스탑리밋 주문이 선택된 경우
Alert("This example is only for placing pending orders BuyLimit, SellLimit, BuyStop and SellStop");
break;
}
//--- 요청 전송 요청 전송에 실패한 경우 오류 코드를 표시하고 작업을 완료
if(!OrderSend(request, result))
{
Print("OrderSend error ", GetLastError());
return;
}
//--- 작동 데이터 표시
PrintFormat("Trade request result: retcode=%u, order=%I64u", result.retcode, result.order);
//--- 거래 수행 결과에서 주문 티켓을 가져와 티켓별로 주문을 선택
ulong ticket=result.order;
ResetLastError();
if(!OrderSelect(ticket))
{
PrintFormat("OrderSelect(%I64u) failed. Error %d", ticket, GetLastError());
return;
}
//--- 티켓에서 선택한 주문 데이터를 저널에 표시
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));
/*
결과:
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
*/
}
//+------------------------------------------------------------------+
//| 말리세컨드로 시간을 반환 |
//+------------------------------------------------------------------+
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'));
}
//+------------------------------------------------------------------+
//| 주문 유형 설명을 반환 |
//+------------------------------------------------------------------+
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");
}
}
|