How to Calculate OrderSwap() Manually?

 

Hi. I am trying to derive the formula used by OrderSwap(). Is it like so:

Orderswap = (MarketInfo(currentsymbol,MODE_TICKVALUE)/MarketInfo(currentsymbol,MODE_TICKSIZE))* MarketInfo(currentsymbol,MODE_POINT) * OrderLots();

?

 

I think I have hit something solid. This might help someone. Here is what I have so far:


//+------------------------------------------------------------------+
//| start convertcurrency                                     
//+------------------------------------------------------------------+
// This is supposed to convert figure from a original currency to a target currency
 double convertcurrency(double originalamount,string originalcurrencysymbol, string intendedcurrencysymbol) 
 {
  /* 
  original price divided by quote price of the intended currency pair will be new price interms of 
  intended currency.
  */
  int asize1 = StringLen(originalcurrencysymbol); 
  int asize2 = StringLen(intendedcurrencysymbol);
  string olstr = originalcurrencysymbol;
     if(asize1 > 3)olstr = StringSubstr(originalcurrencysymbol,asize1-3,3);
  string instr = intendedcurrencysymbol;
     if(asize2 > 3)instr = StringSubstr(intendedcurrencysymbol,asize2-3,3);
  StringToUpper(olstr);
  StringToUpper(instr);
  double bidp = -1;
  double askp = -1;
  double newprice = -1;
  string apair = "";

   //use bid price if you have found pair with intended currency as quote
    apair = StringConcatenate(olstr,instr);  
    bidp = MarketInfo(apair,MODE_BID);   
    
    //use ask price if you have found pair with intended currency as base  
    apair = StringConcatenate(instr,olstr); 
    askp = MarketInfo(apair,MODE_ASK);
    
      if(bidp > 0)
      {
       newprice = originalamount*bidp;
      }
      else if(askp > 0)
      {
       newprice = originalamount/askp;     
      }
      else if(olstr == instr)
      {
       newprice = originalamount;     
      }      
      else
      {
       Print("Failed to receive price rate for "+intendedcurrencysymbol+" inorder to covert from "+originalcurrencysymbol+DoubleToString(originalamount,8)+" to "+intendedcurrencysymbol+". Ensure that the symbol is available and supported.");
      }
  newprice = NormalizeDouble(newprice,4);      
  return newprice;
 }
//+------------------------------------------------------------------+
//| end convertcurrency                                     
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| OrderSwap2                                     
//+------------------------------------------------------------------+
/*
 Get a position's swap(overnight charge/profit) in account currency.
 To use you must enter all three paramters: the symbol, ordertype and Lots. Or leave the symbol,ordertype,Lots blank and enter only Ticket#.
*/
double OrderSwap2( string aSymbol_Or_TicketAsString, int aOrderType=999999999,  double PositionLots=999999999)
{
 int aTicket=StrToInteger(aSymbol_Or_TicketAsString);
 string aSymbol = aSymbol_Or_TicketAsString;
      if(aOrderType == 999999999)aOrderType = -1;
      if(PositionLots == 999999999)PositionLots = -1;
      if(aTicket > 0)
      {     
          if(OrderSelect(aTicket,SELECT_BY_TICKET) == true)
          {
           aSymbol = OrderSymbol();
           aOrderType = OrderType();
           PositionLots = OrderLots();
          }
          else
          {
           Print("Cannot select order for Ticket#"+IntegerToString(aTicket)+" inside OrderSwap2() function.");
           return(0);
          }            
      }
      else if(aSymbol == "" || aOrderType == -1 || PositionLots == -1)
      {
       Print("Error: aSymbol="+aSymbol+", aOrderType="+IntegerToString(aOrderType)+",PositionLots="+DoubleToStr(PositionLots)+". Correct this or simply enter the Ticket# ONLY.");
       return(0);
      }
   // now check swap type
   int swapType=(int)MarketInfo(aSymbol,MODE_SWAPTYPE);//SymbolInfoInteger(aSymbol, SYMBOL_SWAP_MODE);
   double swapRate=0,Swap=0;
   string accntcurrency_str = Account_Currency;
   double pointvalue_in_base_currency=(MarketInfo(aSymbol,MODE_POINT)/MarketInfo(aSymbol,MODE_BID));
   
   //Swap calculation method. 0 - in points; 1 - in the symbol base currency; 2 - by interest; 3 - in the margin currency
   double Amt_in_AccntCurrency=0;
       if (aOrderType==OP_SELL)  
       {
        swapRate=SymbolInfoDouble(aSymbol,SYMBOL_SWAP_SHORT);
       }   
       else if(aOrderType==OP_BUY)
       {  
        swapRate=SymbolInfoDouble(aSymbol,SYMBOL_SWAP_LONG);  
       }    
       if (swapType==0)  
       {
        //swap = swap_long_points|swap_short_points * position_lots = swap in Quote Currency
        Swap = swapRate * PositionLots;
        Amt_in_AccntCurrency = convertcurrency(Swap,aSymbol,accntcurrency_str);    
       }   
       else if (swapType==1)  
       {   
        //swap = swap_long_points|swap_short_points * position_lots = swap in Base Currency
        Swap = swapRate * PositionLots;
  
        // get currency of symbol and  need to convert to account currency
        string base_currency_Str=SymbolInfoString(aSymbol,SYMBOL_CURRENCY_BASE);  
        Amt_in_AccntCurrency = convertcurrency(Swap,base_currency_Str,accntcurrency_str);   
       }   
       else if (swapType==2)   
       {  
        //swap = (swap_long_percent|swap_short_percent / 100)/365 * position_lots = swap in Account Currency
        // interest rate or percentage version
        Swap = (((swapRate/100)*MarketInfo(aSymbol, MODE_BID))/365) * PositionLots;
        Amt_in_AccntCurrency = Swap;           
       }  
       else if (swapType==3)   
       {
        //swap = swap_long_points|swap_short_points * position_lots = swap in Account Currency
        Swap = swapRate * PositionLots;
        Amt_in_AccntCurrency = Swap;
       }

 return(Amt_in_AccntCurrency);
}
//+------------------------------------------------------------------+
//| end of OrderSwap2                                     
//+------------------------------------------------------------------+


. The OrderSwap2 function should return an almost identical result to the OrderSwap function provided by MT4.

example1 - we want to know the swap if we short one lot of EURUSD before we open it: 

string currentsymbol = "EURUSD";

int Ordertype = OP_SELL;

double newposition = 1;

//Here we want know what the swap cost/profit for a position before we send the order. 

double swap = OrderSwap2(currentsymbol,Ordertype,newposition);


example2 - we have already opened the order to short one lot of EURUSD  and we wanted to check its swap:

//Here we already know the ticket number maybe from some previous use of OrderSend, which had returned 4 as the ticket number. 

int aTicket = 4;

double swap = OrderSwap2( IntegerToString(aTicket) );// this is the same as doing OrderSwap2("4");

This is an attempt at a general approach to finding the swap, regardless of which instrument is used. It should work with CFDs also. Therefore, we can safely say "OrderSwap2 == OrderSwap" , with an accuracy of 4 decimal places.