অটোমেটিক ট্রেডিং রোবট TCCI ইন্ডিকেটর এর সিগন্যাল ব্যবহার করে (Automated trading with TCCI Indicator signal)

in আমার বাংলা ব্লগ3 years ago

অনলাইন ফরেক্স ট্রেডিং যাঁরা করে থাকেন তাঁদের জন্য খুবই প্রয়োজনীয় একটি এক্সপার্ট advisor (EA) এটি । এটি মূলত TCCI ফরেক্স ইন্ডিকেটর থেকে প্রাপ্ত সিগন্যাল এর উপর base করে buy/sell বসিয়ে থাকে । অনেকদিন আগে আমি এটির কোডিং সম্পন্ন করেছিলাম । আজ robot টির full code শেয়ার করলাম এখানে । কারো বুঝতে প্রব্লেম হলে কমেন্ট বক্সে যোগাযোগ করবেন বা আমাদের discord channel এও যোগাযোগ করতে পারেন । এর আগে steemit এ একটা অ্যাডভান্সড RSI এক্সপার্ট AdVisor দিয়েছিলাম , কারো দরকার হলে আবারো শেয়ার করবো ।

---------------------------Advanced TCCI EA code---------------------------

//+--------------------------------------------START---------------------------------------------+
//|                                       RM TCCI EA.mq4                                          |
//|            Copyright 2015, MetaQuotes Software Corp. & Copyright 2019,Royal Macro            |
//|                                  https://royalmacro.store                                      |
//+----------------------------------------------------------------------------------------------+
#property copyright "Copyright © 2019-2021, royalmacro"
#property link      "https://royalmacro.store"
#property version   "1.06"
#property description "This TCCI Expert Advisor was developed by @royalmacro on behalf of Royal Macro."
#property description "Any unauthorized use/sell/re-distribution of this product means infringement of copyright."
#property description "-----------------------------------------------------------------------------------"
#property description "If you need any help contact: support@royalmacro.store"
#property description "-----------------------------------------------------------------------------------"
#property strict

//Input Data (variables)
int           BarsToCount         =     500     ;
int           TCCIPrice           =      0     ;
extern int    Length              =     45     ;
extern int    Displace            =      0     ;
extern int    Filter              =      5     ;
int           Color               =      1     ;
int           ColorBarBack        =      0     ;
double        Deviation           =      0.0   ;
extern double Lots                =       0.03 ;
extern double ProfitMade          =       30    ; 
extern double LossLimit           =       0    ;
extern bool trailing_stop = False;
extern double TrailingStop = 10;
extern int MaxSpread = 10;
extern int Slippage = 5;                           // how many pips of slippage can you tolorate
extern bool useTimer=False; // Use start & end trading times in Hours
extern int StartTime=9; // Start hour of Trading day
extern int EndTime=23; // End hour of Trading day

// Trade control
int new_ticket;
int error;
bool          TradeAllowed=true;                    //
double        myPoint;                              // support for 3/5 decimal places
int           loopcount;                            // count of order attempts
int           maxloop=3;                            // maximum number of attempts to handle errors
double        Trail,iTrailingStop;                  //trailing stop variables      
int           MagicNumber  = 1813120;               // allows multiple experts to trade on same account
string        TradeComment = "_RMAT.txt";           // where to log information
//--Time trading
datetime CurrentTime;

// Bar handling
datetime      bartime=0;                            // used to determine when a bar has moved

// used for verbose error logging
#include <stdlib.mqh>

bool IAmRed;
bool IAmGreen;
bool IWasRed;
bool IWasGreen;

int init()
  {
   // get normalized Point based on Broker decimal places
   myPoint = SetPoint();
   
   Print("Init Complete");
   Comment(" ");
   return(0);
  }

int deinit()
  {
   Print("DE-Init Complete");
   Comment(" ");
   return(0);
  }


int start()
  {

   int      cnt=0;
   int      gle=0;
   int      ticket=0;
   int      OrdersPerSymbol=0;

   // stoploss and takeprofit and close control
   double SL=0;
   double TP=0;
   
   double CurrentProfit=0;
   double CurrentBasket=0;
   
   //for trailing stop loss
   double stoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
     
   // direction control
   bool BUYme=false;
   bool SELLme=false;

   double u1,d1;
   //double u2,d2;
   //double c1;
   
   OrdersPerSymbol=0;
   for(cnt=OrdersTotal();cnt>=0;cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if( OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) OrdersPerSymbol++;
        }
     }
   // if(OrdersPerSymbol==0) TradeAllowed=true;

   // bar counting
   if(bartime!=iTime(Symbol(), 0, 0) ) 
     {
      bartime=iTime(Symbol(), 0, 0) ;

 u1=iCustom(Symbol(),0,"TCCI",TCCIPrice,Length,Displace,Filter,Color,ColorBarBack,Deviation,1,1);
 d1=iCustom(Symbol(),0,"TCCI",TCCIPrice,Length,Displace,Filter,Color,ColorBarBack,Deviation,2,1);

  //c1=iCCI(Symbol(),0,CCIPeriod,0,2);

  //save last color 
  IWasGreen=IAmGreen;
  IWasRed=IAmRed;

  // what is the stable color
  //if(u1<200 && d1>200 && c1>0) { IAmRed=false; IAmGreen=true;  }
  //if(u1>200 && d1<200 && c1<0) { IAmRed=true;  IAmGreen=false; }
  if(u1<200 && d1>200) { IAmRed=false; IAmGreen=true;  }
  if(u1>200 && d1<200) { IAmRed=true;  IAmGreen=false; }

  // did trend change, close and set trend
  if(IWasRed   && IAmGreen) { CloseEverything(); TradeAllowed=true; }
  if(IWasGreen && IAmRed  ) { CloseEverything(); TradeAllowed=true; }

  // Every bar trading
  //if(AccountEquity()-AccountBalance()>0) TradeAllowed=true;

  // Trading hours
  if(useTimer==True)
     {
      CurrentTime = TimeCurrent();
      int GetWeekday = TimeDayOfWeek(CurrentTime);
      int GetHour = TimeHour(CurrentTime);
      int GetMinute = TimeMinute(CurrentTime);
      
      if(GetHour > StartTime && GetHour < EndTime && GetWeekday <6)
         {
          //ENTRY LONG (buy, Ask) 
          if(IAmGreen && TradeAllowed) OpenBuy();
          
          //ENTRY SHORT (sell, Bid)
          if(IAmRed && TradeAllowed) OpenSell();

         }
     }
  else
     {
      //ENTRY LONG (buy, Ask) 
      if(IAmGreen && TradeAllowed) OpenBuy();
          
      //ENTRY SHORT (sell, Bid)
      if(IAmRed && TradeAllowed) OpenSell();
     }

   for(cnt=OrdersTotal();cnt>=0;cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
       {
      if( OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber )
        {
        
         if(OrderType()==OP_BUY)
           {
            CurrentProfit=(Bid-OrderOpenPrice()) ;

            // Did we make a profit
            //======================
            if(ProfitMade>0 && CurrentProfit>=(ProfitMade*myPoint))
              {
               CloseBuy("PROFIT");
              }
              

            // Did we take a loss
            //====================
            if(LossLimit>0 && CurrentProfit<=(LossLimit*(-1)*myPoint))
              {
               CloseBuy("LOSS");
              }
              
           } // if BUY

 if(OrderType()==OP_SELL)
   {
    CurrentProfit=(OrderOpenPrice()-Ask);

    // Did we make a profit
    //======================
    if( ProfitMade>0 && CurrentProfit>=(ProfitMade*myPoint) )
      {
       CloseSell("PROFIT");
      }
     

    // Did we take a loss
    //====================
    if( LossLimit>0 && CurrentProfit<=(LossLimit*(-1)*myPoint) )
      {
       CloseSell("LOSS");
      }

   } //if SELL
   
   //if trailingstop is set & trailing_stop is true
    if(TrailingStop>0 && trailing_stop==True)
      {
       iTrailingStop=TrailingStop;
       if(TrailingStop<stoplevel) iTrailingStop=stoplevel;
       Trail=iTrailingStop*myPoint; //Trail=iTrailingStop*Point;
       
       double tsbuy=NormalizeDouble(Bid-Trail,Digits);
       double tssell=NormalizeDouble(Ask+Trail,Digits);
       
       if(OrderType()==OP_BUY && Bid-OrderOpenPrice()>Trail && Bid-OrderStopLoss()>Trail)
         {
          new_ticket=OrderModify(OrderTicket(),OrderOpenPrice(),tsbuy,OrderTakeProfit(),0,Blue);
          if(ticket<0) error_handling(); //if error occured Error handling   
         }
         
       if(OrderType()==OP_SELL && OrderOpenPrice()-Ask>Trail && (OrderStopLoss()-Ask>Trail || OrderStopLoss()==0))
         {
          new_ticket=OrderModify(OrderTicket(),OrderOpenPrice(),tssell,OrderTakeProfit(),0,Blue);
          if(ticket<0) error_handling(); //if error occured Error handling
          }
       
      } //if trailing_stop end
   
    } // if(OrderSymbol)
    
   } //if orderselect()
    
 } // for
  return(0);
  } // start()


//+-----------------+
//| CloseEverything |
//+-----------------+
// Closes all OPEN and PENDING orders

int CloseEverything()
  {
   int i;
    
   for(i=OrdersTotal();i>=0;i--)
     {

      if(OrderSelect(i, SELECT_BY_POS))
       {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if(OrderType()==OP_BUY)       CloseBuy ("CLOSEEverything");
         if(OrderType()==OP_SELL)      CloseSell("CLOSEEverything");
        }
       } //orderselect
     } //for
  return(0);
  } // closeeverything

void OpenBuy()
     {
      int      gle=0;
      int      ticket=0;
      
      double SL=0;
      double TP=0;
      //int loopcount;

      // PLACE order is independent of MODIFY order. 
      // This is mandatory for ECNs and acceptable for retail brokers

      loopcount=0;
      while(true)          
        {
         // place order - NO TP OR SL
         double SymSpread = MarketInfo(Symbol(), MODE_SPREAD); // This will Obtain broker Spread for current pair
         if(MaxSpread > 0 && MaxSpread >= SymSpread) // This part compares broker spread with maximum allowed spread, and refuse trade if maxspread is exceeded
            {
             ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,TradeComment,MagicNumber,White);
            }
         gle=GetLastError();
         if(gle==0)
           {
            TradeAllowed=false;
            Print("BUY PLACED Ticket="+ticket+" Ask="+Ask+" Lots="+Lots);
            break;
           }
          else 
           {
            Print("-----ERROR-----  Placing BUY order: Lots="+Lots+" Bid="+Bid+" Ask="+Ask+" ticket="+ticket+" Err="+gle+" "+ErrorDescription(gle)); 
            
            RefreshRates();
            Sleep(500);

            // give up after loopcount tries
            loopcount++;
            if(loopcount>maxloop)
              {
               Print("-----ERROR-----  Giving up on placing BUY order"); 
               //return(gle);
              }

           }

        }//while - place order 

     }//BUYme

void OpenSell()
     {
      int      gle=0;
      int      ticket=0;
      
      double SL=0;
      double TP=0;
      //int loopcount;

      // PLACE order is independent of MODIFY order. 
      // This is mandatory for ECNs and acceptable for retail brokers

      loopcount=0;
      while(true)
        {
         double SymSpread = MarketInfo(Symbol(), MODE_SPREAD); // This will Obtain broker Spread for current pair
         if(MaxSpread > 0 && MaxSpread >= SymSpread) // This part compares broker spread with maximum allowed spread, and refuse trade if maxspread is exceeded
           {
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,TradeComment,MagicNumber,Red);
           }
         
         gle=GetLastError();
         if(gle==0)
           {
            TradeAllowed=false;
            Print("SELL PLACED Ticket="+ticket+" Bid="+Bid+" Lots="+Lots);
            break;
           }
            else 
           {
            Print("-----ERROR-----  placing SELL order: Lots="+Lots+" SL="+SL+" TP="+TP+" Bid="+Bid+" Ask="+Ask+" ticket="+ticket+" Err="+gle+" "+ErrorDescription(gle)); 
                            
            RefreshRates();
            Sleep(500);

            loopcount++;
            if(loopcount>maxloop)
              {
               Print("-----ERROR-----  Giving up on placing SELL order"); 
               //return(gle);
              }

           }

        }//while

     }//SELLme

void CloseBuy (string myInfo)
  {
   int gle;
   //int cnt;
   //int OrdersPerSymbol;

   loopcount=0;
   
   string bTK=" Ticket="+OrderTicket();
   string bSL=" SL="+OrderStopLoss();
   string bTP=" TP="+OrderTakeProfit();
   string bPM;
   string bLL;
   string bER;

   bPM=" PM="+ProfitMade;
   bLL=" LL="+LossLimit;

   while(true)
     {
      new_ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
      gle=GetLastError();
      bER=" error="+gle+" "+ErrorDescription(gle);

      if(gle==0)
        {
         Print("CLOSE BUY "+myInfo+ bTK + bSL + bTP + bPM + bLL);
         break;
        }
       else 
        {
         Print("-----ERROR----- CLOSE BUY "+myInfo+ bER +" Bid="+Bid+ bTK + bSL + bTP + bPM + bLL);
         RefreshRates();
         Sleep(500);
        }


      loopcount++;
      if(loopcount>maxloop)
        {
         Print("-----ERROR-----  Giving up on closing SELL order"); 
         //return(gle);
        }
                     
     }//while
  
  }

void CloseSell (string myInfo)
  {
   int gle;
   //int cnt;
   //int OrdersPerSymbol;

   loopcount=0;

   string sTK=" Ticket="+OrderTicket();
   string sSL=" SL="+OrderStopLoss();
   string sTP=" TP="+OrderTakeProfit();
   string sPM;
   string sLL;
   string sER;
      
   sPM=" PM="+ProfitMade;
   sLL=" LL="+LossLimit;

   while(true)
     {
      new_ticket=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
      gle=GetLastError();
      sER=" error="+gle+" "+ErrorDescription(gle);
      
      if(gle==0)
        {
         Print("CLOSE SELL "+myInfo + sTK + sSL + sTP + sPM + sLL);
         break;
        }
      else 
        {
         Print("-----ERROR----- CLOSE SELL "+myInfo+ sER +" Ask="+Ask+ sTK + sSL + sTP + sPM + sLL);
         RefreshRates();
         Sleep(500);
        }

      loopcount++;
      if(loopcount>maxloop)
        {
         Print("-----ERROR-----  Giving up on closing SELL order"); 
         //return(gle);
        }
                 
     }//while                 
  }      

double SetPoint()
{
   double mPoint;
  
   if (Digits < 4)
      mPoint = 0.01;
   else
      mPoint = 0.0001;
  
   return(mPoint);
}

void error_handling()
  {
   error=GetLastError(); 
   Print("order execution/modification has failed with error #",error); 
   //Error handling
   switch(error)
     {
      case 4: //Trade server is busy
      case 8: //Too frequent requests
      case 128: //Trade timeout
      case 137: //Broker is busy
      case 141: //Too many requests
      case 146: //Trade context is busy
        Sleep(10000); // Sleep 10 sec
        RefreshRates(); // refresh price data 
        break;    
      
      case 9: //Malfunctional trade operation
      case 129: // Invalid price
      case 130: // Invalid stops
      case 135: // Price changed
      case 138: //Requote
         RefreshRates(); // refresh price data
         break;     
      
      case 6: //No connection with trade server  
      case 136: // Off quotes 
         while(RefreshRates()==false) // Waiting for the tick to come... before new tick
            Sleep(1); // Delay in the cycle  
         break;                    
     }
   
   ResetLastError();
  }
Sort:  

ভাই এগুলো মাথায় ঢুকবে না আমার

 3 years ago 

দেখি কাল থেকে ফোটোগ্রাফি, রেসিপি, গল্প, কবিতা এসব পোস্ট করবো । কোডিং এর তেমন অডিয়েন্স নেই স্টিমিট -এ ।

জি ভাই সুন্দর সুন্দর গল্প আমাদের মাঝে শেয়ার করবেন আমার পড়বো

 3 years ago 

পুরাই মাথা নষ্ট, দাদা সব মাথার উপর দিয়ে গেছে, মনে হচ্ছে মাথা আমার ঘুরতাছে। হবে না আমার দিয়ে এগুলো একদম হবে না।

 3 years ago 

Metaquote Language কিন্তু সোজা, প্রোটোটাইপ সিনট্যাক্স সবই php এর মতো ।

ভাই। কোথায় কোডটা পেস্ট করলে কাজ করবে!? metratrader 5 user.

 3 years ago 

হবে না, এটা MT4 ছাড়া কাজ করবে না ।

MT4 এ ই বা কোথায় পেস্ট করব?

 3 years ago 

Install MQ4 Editor

 3 years ago 

ভাই পুরোটাই মাথার উপর দিয়ে গেল। কিভাবে এতো কিছু আওত্তায় নিয়ে এসেছেন ভাই?. আমার সত্যি মাথা ঘুরছে,,

 3 years ago 

কঠিন ,কিছু না , সেগমেন্ট এ ভাগ ভাগ করে প্রোগ্রামিং করি

 3 years ago 

আমি ও শিখার চেস্টা করবো ভাই। ধন্যবাদ আপনাকে।

 3 years ago 

কিছু কোডিং বুঝতেছি আবার কিছু মাথার উপর দিয়ে যাচ্ছে। প্রোগ্রামিং শুরু করলে হয়তো আপনার মতো কোডিং করতে পারবো ভাইয়া!

 3 years ago 

আসলে এটা তো MetaQuotes Language

ভাই দেখতে অনেকটা অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর মত লাগতেছে। যাই হোক আমার কাছে ইরার হ্যান্ডেলিং টা ভালো লাগছে। আপনার কনসেপ্টটা অনেক ক্লিয়ার বুঝা যাচ্ছে। যারা এর ব্যবহার জানবে তারা সঠিকভাবে আপনার এই সম্পূর্ণ কোড কে কাজে লাগাতে সক্ষম হবে।

দাদা পোস্ট টা খুবই মূল্যবান। তবে এটা দেখতে অনেক বড় লাগছে। তাই আমার কাছে জটিল মনে হচ্ছে। আমার মনে হয় ছোট ছোট কোড গুলো আগে শিখতে হবে। ক্রমান্বয়ে বড় কোডের দিকে অগ্রসর হওয়াটা স্বাভাবিক হবে আমার কাছে।আশা করছি আমাদের জন্য প্রতি সপ্তাহেই একটা করে html এর পোস্ট করবেন।

অনেক শুভেচ্ছা রইলো 😍

Hi my brother @rme how are you there,

 3 years ago 

দাদা আমার একসময় ফরেক্স ট্রেডিং করার খুব ইচ্ছা ছিল কিন্তু ব্যাপারটা বুঝলামনা এবং এর সংশ্লিষ্ট ঝুঁকির ব্যাপারে চিন্তা করে পরে এ থেকে বিরত হওয়া। কিন্তু আমি আপনার মেধার কথা চিন্তা করে হতবাক হয়ে যাচ্ছি। একটা মানুষ একসঙ্গে কিভাবে এত কিছু করতে পারে।আমার প্রোগ্রামিং শেখার কিছুটা ইচ্ছা আছে। কিন্তু আপনি যেটা দিয়েছেন এটা সম্পূর্ণ আমার বোঝার বাইরে। হয়তো আস্তে আস্তে শিখতে পারবো কিছু। ধন্যবাদ দাদা।

আমি এই পোস্টটি মেশিনের ভাষা সম্পর্কে বুঝতে পারি না। তিনি তিনি
I don't understand this post about machine language. He he he

 3 years ago 

ভাই পুরোটাই মাথার উপর দিয়ে গেছে।

Coin Marketplace

STEEM 0.27
TRX 0.13
JST 0.032
BTC 65355.17
ETH 2949.96
USDT 1.00
SBD 3.67