Orders Execution
0
Views
0
Downloads
0
Favorites
CycleMarketOrder_V181
//+------------------------------------------------------------------+
//| CycleMarketOrder.mq4 |
//| Copyright (c) 2013, stock.yumokin.jp |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) 2013, stock.yumokin.jp"
#property link "https://stock.yumokin.jp"
#property version "1.81"
#property strict
#include <stderror.mqh>
#include <stdlib.mqh>
#define WAIT_TIME 5
extern int magic = 20140000;
extern int entry = 1;
extern double maxPrice = 105;
extern int maxCnt = 100;
extern double lots = 0.01;
extern double BreakEven = 40;
extern double TrailingStop = 20;
extern int spanPips = 10;
double pointPerPips;
int slippage = 3;
int slippagePips;
extern int WeekendMode=0;
extern int WeekendHour=4;
extern int WeekstartHour=8;
color ArrowColor[6] = {Red, Green, Red, Green, Red, Green};
string magicArray[];
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init() {
int mult = 1;
if(Digits == 3 || Digits == 5) {
mult = 10;
}
pointPerPips = Point * mult;
slippagePips = slippage * mult;
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit() {
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start(){
int ret = 0;
int i = 0;
string symbolCode;
if(IsTradeAllowed() == false) {
Print("Trade not Allowed");
return(0);
}
//WEEKEND STOP
if(WeekendMode==1){
if(CheckOnTime() == -1){
for(i=0; i < maxCnt; i++) {
OrderCancel(-1, magic + i);
}
for(i=0; i < maxCnt; i++) {
OrderCancel(1, magic + i);
}
return(0);
}
}
if(setOrderCommnet() == false){
return(0);
}
//MODIFY
for(i=0; i < maxCnt; i++) {
MoveTrailingStop(magic + i, BreakEven, TrailingStop, pointPerPips);
}
if(entry==0){
return(0);
}
ret = doCycleMarketOrder(lots, maxPrice
, maxCnt , spanPips
, magic);
return(0);
}
//+------------------------------------------------------------------+
int doCycleMarketOrder(double lots, double maxPrice, int maxCnt, int spanPips, int magic) {
bool isBuyFlag;
double startPrice;
double endPrice;
double currentPrice;
int magicNumber;
for(int i=0; i < maxCnt; i++){
if(entry==1){
isBuyFlag = true;
//startPrice > endPrice
startPrice = maxPrice - spanPips * ((maxCnt-1)-i) * pointPerPips;
endPrice = maxPrice - spanPips * (maxCnt-i) * pointPerPips;
currentPrice = Ask;
magicNumber = magic + ((maxCnt-1)-i);
}
else if(entry==-1){
isBuyFlag = false;
//startPrice < endPrice
startPrice = maxPrice - spanPips * i * pointPerPips;
endPrice = maxPrice - spanPips * (i-1) * pointPerPips;
currentPrice = Bid;
magicNumber = magic + i;
}
int index = getOrderCommnet(magicNumber);
if ( index < 0) {
doMarketOrder(lots, startPrice, endPrice, slippagePips, isBuyFlag, magicNumber);
}
}
return(0);
}
int doMarketOrder(double lots, double startPrice, double endPrice, int slippage, bool isBuyFlag, int magicNumber) {
int tradeType = -1;
double openPrice;
string comment = StringConcatenate(magicNumber," ");
if(isBuyFlag && startPrice <= Ask) {
return(-1);
} else if(isBuyFlag && (startPrice > Ask && Ask > endPrice)) {
tradeType = OP_BUY;
openPrice=Ask;
} else if(!isBuyFlag && startPrice >= Bid) {
return(-1);
} else if(!isBuyFlag && (startPrice < Bid && Bid < endPrice)) {
tradeType = OP_SELL;
openPrice=Bid;
}
if(tradeType == -1) {
return(-1);
}
int errCode = 0;
int ticket = doOrderSend(tradeType,lots,openPrice,slippage,comment,magicNumber,errCode);
return(ticket);
}
int doOrderSend(int type, double lots, double openPrice, int slippage, string comment, int magicNumber, int &errCode) {
openPrice = NormalizeDouble(openPrice, Digits);
int starttime = GetTickCount();
while(true) {
if(GetTickCount() - starttime > WAIT_TIME * 1000) {
Print("OrderSend timeout. Check the experts log.");
return(false);
}
if(IsTradeAllowed() == true) {
RefreshRates();
int ticket = OrderSend(Symbol(), type, lots, openPrice, slippage, 0, 0, comment, magicNumber, 0, ArrowColor[type]);
if( ticket > 0) {
return(ticket);
}
errCode = GetLastError();
Print("[OrderSendError] : ", errCode, " ", ErrorDescription(errCode));
Print("price=",openPrice);
if(errCode == ERR_INVALID_PRICE || errCode == ERR_INVALID_STOPS) {
break;
}
}
Sleep(100);
}
return(-1);
}
bool setOrderCommnet(){
int orderCount=0;
int j;
for(j=0; j < OrdersTotal(); j++) {
if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES) == false) return(false);
if(OrderSymbol() == Symbol()) {
orderCount++;
}
}
ArrayResize(magicArray,orderCount);
orderCount=0;
for(j=0; j < OrdersTotal(); j++) {
if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES) == false) return(false);
if(OrderSymbol() == Symbol()) {
magicArray[orderCount] = OrderComment();
orderCount++;
}
}
return(true);
}
int getOrderCommnet(int magicNumber){
int index = -1;
for(int i=0; i < ArraySize(magicArray); i++) {
index = StringFind(magicArray[i],DoubleToStr(magicNumber,0),0);
if(index >= 0){
break;
}
}
return(index);
}
int TicketClose(int mode,int magicNumber)
{
int total=OrdersTotal();
for(int i=total-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) ==false){
continue;
}
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicNumber){
if(mode == 1){
if(OrderType() == OP_BUY){
if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Green) != TRUE){
Print("LastError = ", ErrorDescription(GetLastError()));
}
return(0);
}
else if(OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP){
if( OrderDelete(OrderTicket()) !=TRUE ){
Print("LastError = ", ErrorDescription(GetLastError()));
}
return(0);
}
}
else if(mode == -1){
if(OrderType() == OP_SELL){
if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Green) != TRUE){
Print("LastError = ", ErrorDescription(GetLastError()));
}
return(0);
}
else if(OrderType() == OP_SELLLIMIT || OrderType() == OP_SELLSTOP){
if( OrderDelete(OrderTicket()) !=TRUE ){
Print("LastError = ", ErrorDescription(GetLastError()));
}
return(0);
}
}
}
}
return(0);
}
int OrderCancel(int mode,int magicNumber)
{
int total=OrdersTotal();
for(int i=total-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) ==false){
continue;
}
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicNumber){
if(mode == 1){
if(OrderType() == 2 || OrderType() == 4){
if( OrderDelete(OrderTicket()) !=TRUE ){
Print("LastError = ", ErrorDescription(GetLastError()));
}
return(0);
}
}
else if(mode == -1){
if(OrderType() == 3 || OrderType() == 5){
if( OrderDelete(OrderTicket()) !=TRUE ){
Print("LastError = ", ErrorDescription(GetLastError()));
}
return(0);
}
}
}
}
return(0);
}
int MoveTrailingStop(int magicNumber, double BreakEven, double TrailingStop, double pointPerPips){
int DigitsNum;
double bp = BreakEven*pointPerPips;
double tp = TrailingStop*pointPerPips;
int index;
if(Digits == 3 || Digits == 5){
DigitsNum=Digits-2;
}
else{
DigitsNum=Digits-1;
}
int total=OrdersTotal();
for(int i=total-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magicNumber){
if(OrderType()==OP_BUY)
{
if(TrailingStop>0)
{
if(NormalizeDouble(OrderOpenPrice()+bp,DigitsNum) <= NormalizeDouble(Bid-tp,DigitsNum)){
if((NormalizeDouble(OrderStopLoss(),DigitsNum) < NormalizeDouble(Bid-tp,DigitsNum)) || OrderStopLoss()==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-tp,DigitsNum),OrderTakeProfit(),0,Blue);
return(0);
}
}
}
}
else if(OrderType()==OP_SELL)
{
if(TrailingStop>0)
{
if(NormalizeDouble(OrderOpenPrice()-bp,DigitsNum) >= NormalizeDouble(Ask+tp,DigitsNum)){
if((NormalizeDouble(OrderStopLoss(),DigitsNum) > NormalizeDouble(Ask+tp,DigitsNum)) || OrderStopLoss()==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+tp,DigitsNum),OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
int CheckOnTime(){
datetime CurrentDateTime = TimeLocal();
int CurrentHour=TimeHour(CurrentDateTime);
int CurrentWeek=TimeDayOfWeek(CurrentDateTime);
if((CurrentWeek==6 && CurrentHour>=WeekendHour) || CurrentWeek==0 || (CurrentWeek==1 && CurrentHour<WeekstartHour)){
return(-1);
}
else{
return(1);
}
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---