#define DEVIATION 5 // 가격에서 허용된 편차
#define VOLUME 1.0 // 주문 볼륨
#define EXPERT_MAGIC 123 // MagicNumber
#define DIRECTION ORDER_TYPE_BUY // 진입한 가격 방향 (ORDER_TYPE_BUY or ORDER_TYPE_SELL)
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 요청, 확인 및 결과 구조를 선언하고 초기화
MqlTradeRequest request={};
MqlTradeCheckResult check ={};
MqlTradeResult result ={};
//---거래 요청 매개변수 준비
PrepareRequest(_Symbol, DIRECTION, VOLUME, request);
//--- 거래 요청 매개변수 확인
ResetLastError();
bool res=OrderCheck(request, check);
if(!res)
{
PrintFormat("Trade request verification completed with error %d\nServer retcode: %u, comment: %s", GetLastError(), check.retcode, check.comment);
return;
}
//--- 거래 요청 확인이 성공했습니다 - 거래 요청 확인 구조 필드에 대한 설명을 표시
Print("Trade request verification completed successfully");
MqlTradeCheckResultPrint(check, 14);
//--- 거래 요청 전송
if(!OrderSend(request, result))
Print("OrderSend error ", GetLastError()); // 요청을 보낼 수 없으면 오류 코드를 표시
//--- 운용에 대한 정보
PrintFormat("Trade request result: retcode=%u, deal=%I64u, order=%I64u", result.retcode, result.deal, result.order);
/*
클라이언트 터미널에서 자동 거래가 비활성화 된 결과
Trade request verification completed with error 4752
Server retcode: 10027, comment: AutoTrading disabled by client
자동 거래를 활성화하고 폐장한 시장에서 다시 확인
Experts automated trading is enabled
Trade request verification completed successfully
Retcode: 0
Balance: 10779.50 USD
Equity: 10779.50 USD
Profit: 0.00 USD
Margin: 1104.79 USD
Margin free: 9674.71 USD
Margin level: 975.71 %
Comment: Done
OrderSend error 4756
Trade request result: retcode=10018, deal=0, order=0
시장에서 확인
Trade request verification completed successfully
Retcode: 0
Balance: 10779.50 USD
Equity: 10779.50 USD
Profit: 0.00 USD
Margin: 110.46 USD
Margin free: 10669.04 USD
Margin level: 9758.74 %
Comment: Done
Trade request result: retcode=10009, deal=2777010968, order=2802818813
*/
}
//+------------------------------------------------------------------+
//| 거래 요청을 위한 매개변수 준비 |
//+------------------------------------------------------------------+
void PrepareRequest(const string symbol, const ENUM_ORDER_TYPE order_type, const double volume, MqlTradeRequest &request)
{
ENUM_ORDER_TYPE type=(DIRECTION !=ORDER_TYPE_BUY ? ORDER_TYPE_SELL : DIRECTION);
double price=(DIRECTION==ORDER_TYPE_BUY ? SymbolInfoDouble(Symbol(), SYMBOL_ASK) : SymbolInfoDouble(Symbol(), SYMBOL_BID));
//--- 매개 변수 요청
request.action = TRADE_ACTION_DEAL; // 거래 운영 유형
request.symbol = symbol; // 심볼
request.volume = volume; // 볼륨
request.type = type; // 주문 유형
request.price = price; // 시가
request.deviation = DEVIATION; // 가격에서 허용된 편차
request.magic = EXPERT_MAGIC; // 주문 매직넘버
}
//+------------------------------------------------------------------+
//| 거래 요청 필드 출력 |
//| 저널에서 결과 검증 |
//+------------------------------------------------------------------+
void MqlTradeCheckResultPrint(const MqlTradeCheckResult &check, const uint header_width=0)
{
//--- 계좌 통화와 계좌 통화의 소수 자릿수를 획득
string currency=AccountInfoString(ACCOUNT_CURRENCY);
int digits =(int)AccountInfoInteger(ACCOUNT_CURRENCY_DIGITS);
//--- 헤더 텍스트와 헤더 필드의 너비를 정의합니다.
//--- 헤더 너비가 0과 같은 함수에 전달되면 너비는 헤더 줄 크기 + 1이 됩니다.
string header="Retcode:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- 저널에 지정된 너비의 헤더와 함께 반환 코드를 표시
PrintFormat("%-*s%-u", w, header, check.retcode);
//--- 저널에서 거래 작업을 실행한 후 잔액 값을 표시
header="Balance:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.balance, currency);
//--- 저널에서 거래 작업을 실행한 후 자산 가치를 표시
header="Equity:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.equity, currency);
//--- 저널에서 거래 작업을 실행한 후 유동 이익 값을 표시
header="Profit:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.profit, currency);
//--- 필요한 거래 작업에 필요한 마진 금액을 저널에 표시
header="Margin:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.margin, currency);
//--- 거래 작업을 수행한 후 남은 자산 가치를 저널에 표시
header="Margin free:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.margin_free, currency);
//--- 저널에서 필요한 거래 작업을 완료한 후 설정할 마진 수준을 표시
header="Margin level:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.2f %%", w, header, check.margin_level);
//--- 응답 코드에 대한 코멘트와 오류 설명을 저널에 표시
header="Comment:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-s", w, header, check.comment);
}
|