//+------------------------------------------------------------------+ //| Donchain counter-channel system.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| | //+------------------------------------------------------------------+ #property copyright "by djindyfx" #property link "" extern double Lots =1.0; extern int Slippage=3; extern int Magic =20051006; // Optimalization parameters: extern int LngPeriod=20; extern int ShtPeriod=10; extern int Entry_Stop=100; //extern int TimeFrame =PERIOD_D1; // Time frame of the Donchain indicator. // Privete variables datetime last_trade_time; // in order to execute maximum only one trade a day. //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ReportStrategy(int Magic) { int totalorders=HistoryTotal(); double StrategyProfit=0.0; int StrategyOrders=0; for(int j=0; j<totalorders;j++) { if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) && (OrderMagicNumber()==Magic)) { if((OrderType()==OP_BUY) || (OrderType()==OP_SELL)) { StrategyOrders++; StrategyProfit+=OrderProfit(); } } } totalorders=OrdersTotal(); for(j=0; j<totalorders;j++) { if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) && (OrderMagicNumber()==Magic)) { if((OrderType()==OP_BUY) ||(OrderType()==OP_SELL)) { StrategyOrders++; StrategyProfit+=OrderProfit(); } } } Comment("Executed ", StrategyOrders, " trades with ", StrategyProfit," of profit"); return; } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { double stop_short; double stop_long; double ELong; double EShort; //---- bool entry_short; bool entry_long; bool are_we_long =false; bool are_we_short =false; bool are_we_PendShort = false; bool are_we_PendLong = false; int orders_in_trade=0; int active_order_ticket; //---- //Channels for Entry and Stop // Entry Channel ELong=High[iHighest(NULL,0,MODE_HIGH,LngPeriod,0)]; EShort=Low[iLowest(NULL,0,MODE_LOW,LngPeriod,0)]; // Stop Channel stop_long=Low[iLowest(NULL,0,MODE_LOW,ShtPeriod,0)]; stop_short=High[iHighest(NULL,0,MODE_HIGH,ShtPeriod,0)]; ReportStrategy(Magic); // Check current trades: int TotalOrders=OrdersTotal(); for(int j=0;j<TotalOrders;j++) { OrderSelect(j, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { are_we_long =are_we_long || OrderType()==OP_BUY; are_we_short=are_we_short || OrderType()==OP_SELL; are_we_PendShort=are_we_PendShort || OrderType()==OP_SELLSTOP; are_we_PendLong=are_we_PendLong || OrderType()==OP_BUYSTOP; orders_in_trade++; active_order_ticket=OrderTicket(); /* // Lower channel: stop_long=Low[iLowest(NULL,0,MODE_LOW,ShtPeriod,0)]; // Upper channel: stop_short=High[iHighest(NULL,0,MODE_HIGH,ShtPeriod,0)]; */ if(are_we_long && OrderType()==OP_BUY) { // We have long position. Check stop loss: OrderSelect(active_order_ticket, SELECT_BY_TICKET); if(OrderStopLoss() < stop_long) OrderModify(active_order_ticket,OrderOpenPrice(),stop_long,OrderTakeProfit(),0,Blue); //---- } if(are_we_short && OrderType()==OP_SELL) { // We have long position. Check stop loss: OrderSelect(active_order_ticket, SELECT_BY_TICKET); if(OrderStopLoss() > stop_short) OrderModify(active_order_ticket,OrderOpenPrice(),stop_short,OrderTakeProfit(),0,Blue); //---- } if(are_we_PendLong && OrderType() ==OP_BUYSTOP) { OrderSelect(active_order_ticket, SELECT_BY_TICKET); if((TimeCurrent()- OrderOpenTime())>360*60*60) OrderDelete(active_order_ticket); } if(are_we_PendShort && OrderType()==OP_SELLSTOP) { OrderSelect(active_order_ticket, SELECT_BY_TICKET); if((TimeCurrent() -OrderOpenTime())>360*60*60) OrderDelete(active_order_ticket); } } //not true }// end for if (orders_in_trade > 0) return(0); //Do not execute new trade for a next 24 hours. if((TimeCurrent() - last_trade_time)<24*60*60) return(0); double y = iMA(NULL,0,150,0,MODE_SMA,PRICE_CLOSE,0); /* // Upper channel: ELong=High[iHighest(NULL,0,MODE_HIGH,LngPeriod,0)]; // lower channel: EShort=Low[iLowest(NULL,0,MODE_LOW,LngPeriod,0)]; */ double ELong1=ELong+50*Point; double ELong2=ELong+100*Point; double ELong3=ELong+150*Point; double EShort1=EShort-50*Point; double EShort2=EShort-100*Point; double EShort3=EShort-150*Point; //if(entry_long && entry_short) //Alert("Short and long entry. Probably one of the is wrong."); if (ELong==Ask && Ask>y) { OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage,stop_long/*Bid-Entry_Stop*Point*/,0, "", Magic,0, FireBrick); Sleep(2000); OrderSend(Symbol(), OP_BUYSTOP, Lots, ELong1, Slippage,stop_long/*Bid-Entry_Stop*Point*/,0, "", Magic,0, FireBrick); Sleep(2000); OrderSend(Symbol(), OP_BUYSTOP, Lots, ELong2, Slippage,stop_long /*Bid-Entry_Stop*Point*/,0, "", Magic,0, FireBrick); Sleep(2000); OrderSend(Symbol(), OP_BUYSTOP, Lots, ELong3, Slippage,stop_long /*Bid-Entry_Stop*Point*/,0, "", Magic,0, FireBrick); last_trade_time=TimeCurrent(); } if(EShort==Bid && Bid<y) { OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,stop_short/*Ask+Entry_Stop*Point*/,0,"",Magic,0,FireBrick); Sleep(2000); OrderSend(Symbol(),OP_SELLSTOP,Lots,EShort1,Slippage,stop_short/*Ask+Entry_Stop*Point*/,0,"",Magic,0,FireBrick); Sleep(2000); OrderSend(Symbol(),OP_SELLSTOP,Lots,EShort2,Slippage,stop_short/*Ask+Entry_Stop*Point*/,0,"",Magic,0,FireBrick); Sleep(2000); OrderSend(Symbol(),OP_SELLSTOP,Lots,EShort3,Slippage,stop_short/*Ask+Entry_Stop*Point*/,0,"",Magic,0,FireBrick); last_trade_time=TimeCurrent(); } //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Indicator Curves created:
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It can change open orders parameters, due to possible stepping strategy
It automatically opens orders when conditions are reached
Other Features: