BTC USD 81,506.8 Gold USD 4,352.82
Time now: Jun 1, 12:00 AM

EA ketigaku - ThreeDemons

Izham87

Active Member
Messages
1,198
Joined
Jul 14, 2016
Messages
1,198
Reaction score
528
Points
81
Salam semua..

EA ni dibuat atas dasar suka2 dan atas dasar semangat belajar coding mql4. bukan nak digunakan kat real akaun.

Algo EA ni:

1. bukak buy&sell serentak dengan tp yang boleh set, katakan 10 pip.
2. bila salah satu post hit tp, katakan sell hit tp, maka tp buy akan diadjust ke breakeven + spread.
3. position buy tadi akan dibiarkan dan pada masa yang sama selepas sell hit tp tadi, buy&sell serentak akan dilakukan lagi dengan tp 10 pip.

so, dengan ini, post akan sentiasa close dalam profit. equity akan bertambah, dalam masa sama float = pertambahan profit. macam tak guna la..:eek: :eek: :eek: (EA tak guna ni untuk educational purpose je tau)

nama EA ni ThreeDemons sebab yang menyebabkan equity kurang dalam EA ni ada 3 bende/demons:

1. Spread
2. Swap
3. Slippage

Code EA seperti di bawah (untuk 5-decimal broker):

Code:
//+------------------------------------------------------------------+
//|                                                  ThreeDemons.mq4 |
//|                                          Copyright 2017, Izham87 |
//|                                          https://www.Izham87.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Izham87"
#property link      "https://www.Izham87.com"
#property version   "1.00"
#property strict

#include <stderror.mqh>
#include <stdlib.mqh>


extern double TP = 100;
extern double Lot = 0.01;
extern int MagicNumber = 77;

int lastbuyticket = 0;
int lastsellticket = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  **
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  **
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
if(subTotalTrade()==0)  
subDoubleDose();
else
{
//check lastbuy ticket
if(OrderSelect(lastbuyticket,SELECT_BY_TICKET)==true && OrderCloseTime()>0)
subModifyOrder(lastsellticket);
else
Print("OrderSelect lastbuyticket returned the error of ",GetLastError());

//check lastsell ticket
if(OrderSelect(lastsellticket,SELECT_BY_TICKET)==true && OrderCloseTime()>0)
subModifyOrder(lastbuyticket);
else
Print("OrderSelect lastsellticket returned the error of ",GetLastError());
**    
**

//+------------------------------------------------------------------+
void subModifyOrder(int ticketmodify)
{
double takeprofit=0;
if(OrderSelect(ticketmodify,SELECT_BY_TICKET)==true)
{
 if(OrderType()==OP_BUY)
 takeprofit=OrderOpenPrice()+(Ask-Bid);
 else
 takeprofit=OrderOpenPrice()-(Ask-Bid);
 bool res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),takeprofit,0,CLR_NONE);
 if(!res)
 Print("Error in OrderModify. Error code=",GetLastError());
 else
 {
 Print("Order modified successfully.");
subDoubleDose();
** 
**
else
Print("OrderSelect ticketmodify returned the error of ",GetLastError());
**


//+------------------------------------------------------------------+
void subDoubleDose()
{
 int ticket;
  ticket = subOpenOrder(OP_SELL, Symbol(), Lot);
  subCheckError(ticket, "SELL");
  lastsellticket=ticket;
  ticket = subOpenOrder(OP_BUY, Symbol(), Lot);
  subCheckError(ticket, "BUY");
  lastbuyticket=ticket;
**

//+------------------------------------------------------------------+
int subOpenOrder(int type, string symbol, double openlot)
{
   int
         ticket      = 0,
         err         = 0,
         c           = 0;
         
   double         
         aStopLoss   = 0,
         aTakeProfit = 0,
         bStopLoss   = 0,
         bTakeProfit = 0;


   aTakeProfit = NormalizeDouble(Ask+TP*Point(),(int)Digits);
    bTakeProfit = NormalizeDouble(Bid-TP*Point(),(int)Digits);
 
  
   
   if(type==OP_BUY)
   {
      for(c=0;c<10;c++)
      {  
         ticket=OrderSend(symbol,OP_BUY,openlot,Ask,5,aStopLoss,aTakeProfit,"",MagicNumber,0);
         err=GetLastError();
         if(err==0)
         { 
            if(ticket>0) break;
         **
         else
         {
            if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors
            {
               Sleep(5000);
               continue;
            **
            else //normal error
            {
               if(ticket>0) break;
            **  
         **
      **   
   **
   
   if(type==OP_SELL)
   {   
      for(c=0;c<10;c++)
      {
         ticket=OrderSend(symbol,OP_SELL,openlot,Bid,5,bStopLoss,bTakeProfit,"",MagicNumber,0);
         err=GetLastError();
         if(err==0)
         { 
            if(ticket>0) break;
         **
         else
         {
            if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors
            {
               Sleep(5000);
               continue;
            **
            else //normal error
            {
               if(ticket>0) break;
            **  
         **
      **   
   **  
   return(ticket);
**

void subCheckError(int ticket, string Type)
{
    if(ticket>0) 
    {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
      {
      Print(Type + " order opened : ",OrderOpenPrice());
    **
    else Print("Error opening " + Type + " order : (",GetLastError(),") ", ErrorDescription(GetLastError()));
    **
**



//----------------------- 
int subTotalTrade()
{
   int cnt;
   int total = 0;

   for(cnt=0;cnt<OrdersTotal();cnt++)
   {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true){
      if(OrderType()<=OP_SELL &&
         OrderMagicNumber()==MagicNumber) total++;**
   **
   return(total);
 **
 
tq tuan

ea ni bagus kalau market trending
pasti asek tp 10 pip
 
Ada buat improvement sikit, create dua counter buytpcounter & selltp counter. pastu lot yang dibuka ikut ratio berapa byk counter2 tersebut. tujuannya supaya kalau buy selalu kena tp, lot untuk buy lebih besar sedikit dari lot untuk sell dan sebaliknya. adaptive trend following. ratio ni pakai total buy + sell tp as denominator dari mula ea execute.. saya dpt idea baru tadi, buat ratio 10 total buy & sell tp yang terakhir lagi bagus kot...ada masa baru coding yang ni...



Code:
//+------------------------------------------------------------------+
//|                                       ThreeDemonsLotBalancer.mq4 |
//|                                          Copyright 2017, Izham87 |
//|                                          https://www.Izham87.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Izham87"
#property link      "https://www.Izham87.com"
#property version   "1.00"
#property strict

#include <stderror.mqh>
#include <stdlib.mqh>


extern double TP = 100;
extern double Lot = 0.06;
extern int MagicNumber = 77;
extern double minlot = 0.01;
extern double maxlot = 100.0;

int lastbuyticket = 0;
int lastsellticket = 0;

int BuyTPCounter = 0;
int SellTPCounter = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  **
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  **
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
if(subTotalTrade()==0)  
subDoubleDose();
else
{
//start check lastbuy ticket
if(OrderSelect(lastbuyticket,SELECT_BY_TICKET)==true)
{
if(OrderCloseTime()>0) //buy order was closed
{
subModifyOrder(lastsellticket); //modify sell order tp to BE
BuyTPCounter+=1;
subDoubleDose();
**
**
else
Print("OrderSelect lastbuyticket="+lastbuyticket+" returned the error of ",GetLastError());
//end check lastbuy ticket

//start check lastsell ticket
if(OrderSelect(lastsellticket,SELECT_BY_TICKET)==true)
{
if(OrderCloseTime()>0)
{
subModifyOrder(lastbuyticket);
SellTPCounter+=1;
subDoubleDose();
**
**
else
Print("OrderSelect lastsellticket="+lastsellticket+" returned the error of ",GetLastError());
//end check lastsell ticket

**
    
**

//+------------------------------------------------------------------+
void subModifyOrder(int ticketmodify)
{
double takeprofit=0;
if(OrderSelect(ticketmodify,SELECT_BY_TICKET)==true)
{
 takeprofit=OrderOpenPrice();
 bool res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),takeprofit,0,CLR_NONE);
 if(!res)
 Print("Error in OrderModify. Error code=",GetLastError());
 else
 Print("Order modified successfully."); 
**
else
Print("OrderSelect ticketmodify returned the error of ",GetLastError());
**


//+------------------------------------------------------------------+
void subDoubleDose()
{
 int ticket;
 double orderlot;
  
  if(BuyTPCounter==0 || SellTPCounter==0) orderlot=Lot*0.5;
  else orderlot=WithinMinMax((BuyTPCounter*Lot)/(BuyTPCounter+SellTPCounter),minlot,maxlot);
   
  ticket = subOpenOrder(OP_BUY, Symbol(), NormalizeDouble(orderlot,2));
  subCheckError(ticket, "BUY");
   if(ticket>0) lastbuyticket=ticket;
  
  if(BuyTPCounter==0 || SellTPCounter==0) orderlot=Lot*0.5;
  else orderlot=WithinMinMax((SellTPCounter*Lot)/(BuyTPCounter+SellTPCounter),minlot,maxlot); 
  
  ticket = subOpenOrder(OP_SELL, Symbol(), NormalizeDouble(orderlot,2));
  subCheckError(ticket, "SELL");
  if(ticket>0) lastsellticket=ticket;
  
 

  
**

//+------------------------------------------------------------------+
int subOpenOrder(int type, string symbol, double openlot)
{
   int
         ticket      = 0,
         err         = 0,
         c           = 0;
         
   double         
         aStopLoss   = 0,
         aTakeProfit = 0,
         bStopLoss   = 0,
         bTakeProfit = 0;


   aTakeProfit = NormalizeDouble(Ask+TP*Point(),(int)Digits);
    bTakeProfit = NormalizeDouble(Bid-TP*Point(),(int)Digits);
 
   
   if(type==OP_BUY)
   {
      for(c=0;c<10;c++)
      {  
         ticket=OrderSend(symbol,OP_BUY,openlot,Ask,5,aStopLoss,aTakeProfit,"",MagicNumber,0);
         err=GetLastError();
         if(err==0)
         { 
            if(ticket>0) break;
         **
         else
         {
            if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors
            {
               Sleep(5000);
               continue;
            **
            else //normal error
            {
               if(ticket>0) break;
            **  
         **
      **   
   **
   
   if(type==OP_SELL)
   {   
      for(c=0;c<10;c++)
      {
         ticket=OrderSend(symbol,OP_SELL,openlot,Bid,5,bStopLoss,bTakeProfit,"",MagicNumber,0); 
         err=GetLastError();
         if(err==0)
         { 
            if(ticket>0) break;
         **
         else
         {
            if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors
            {
               Sleep(5000);
               continue;
            **
            else //normal error
            {
               if(ticket>0) break;
            **  
         **
      **   
   **  
   return(ticket);
**

void subCheckError(int ticket, string Type)
{
    if(ticket>0) 
    {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
      {
      Print(Type + " order opened : ",OrderOpenPrice());
    **
    else Print("Error opening " + Type + " order : (",GetLastError(),") ", ErrorDescription(GetLastError()));
    **
**




//----------------------- 
int subTotalTrade()
{
   int cnt;
   int total = 0;

   for(cnt=0;cnt<OrdersTotal();cnt++)
   {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true){
      if(OrderType()<=OP_SELL &&
         OrderMagicNumber()==MagicNumber) total++;**
   **
   return(total);
 **
 
 
 double WithinMinMax(double lot, double min, double max) { 
   double retval = lot;
   if (lot < min) retval = min;
   if (lot > max) retval = max;
   return (retval);
**
 

Latest Posts

Live Forex Chart

Currency
Rates
EUR / USD
1.14749
USD / JPY
157.056
GBP / USD
1.33763
USD / CHF
0.82340
USD / CAD
1.40091
EUR / JPY
180.232
AUD / USD
0.71229
Back
Top
Log in Register