Okay, here's a breakdown of what this script does, explained in a way that avoids technical jargon and is easy for someone who doesn't know programming to understand:
This script is designed to automatically place and manage buy and sell orders for a specific financial instrument (like a currency pair) on the MetaTrader platform. It aims to profit from price movements by strategically setting up orders based on certain calculated levels.
Here's the core idea: The script monitors the price and places pending "buy stop" and "sell stop" orders. These are basically instructions to automatically buy if the price rises to a certain level, or sell if the price falls to a certain level. The script uses moving averages as reference points to determine these levels. Moving averages smooth out the price data over a period of time, which can help to identify trends.
Here's a more detailed step-by-step explanation:
-
Initial Setup and Checks: The script starts by checking if there's enough historical price data available (at least 100 data points) and if the specified "TakeProfit" value is reasonable (at least 10). If not, it stops. The script takes the symbol of the chart where it is running.
-
Calculating Key Price Levels:
- It calculates two moving averages of the price, one based on the high price and one based on the low price, both using a period of 144. These moving averages act as key reference points.
- It then calculates the "BuyPrice" and "SellPrice" based on these moving averages. The "BuyPrice" is set slightly above the high moving average, and the "SellPrice" is set slightly below the low moving average. The "PipDifference" setting determines exactly how far away from these averages the pending orders are placed.
- "BuyStopLoss" and "SellStopLoss" which are stop losses, are calculated based on the opposite moving average, this is how far we are willing to lose in case the trade goes south, this is set a little below the low moving average for buy trades and a little above the high moving average for sell trades.
- "BuyTakeProfit" and "SellTakeProfit" define when to close the trades with profit, they are calculated based on the TakeProfit setting.
- It also calculates how big each trade (in terms of "Lots") should be, based on the account size and the "MaximumRisk" setting. This is to manage risk by ensuring that trades are not too large relative to the available funds.
-
Managing Existing Orders:
- The script then looks at all existing orders on the account for the specific trading symbol and that were placed by this script.
- If it finds a "buy stop" or "sell stop" order, it checks if the stop loss and take profit levels are in sync with the moving averages values and updates those levels to the correct values.
- If it finds an open "buy" or "sell" position, it checks that the stop loss is not smaller/bigger (depending on the trade) than the calculated stop loss. In this case, the code modifies the order or deletes it, so it later replaces it with a new order.
- It implements a "trailing stop" feature. This means that if a trade becomes profitable, the stop loss level is automatically moved closer to the current price, locking in profits. The "TrailingStop" setting determines how far the stop loss trails behind the price.
-
Placing New Orders:
- The script checks that there are enough funds available on the account to place new orders.
- Finally, if the current price is between the high and low moving averages, and if the script needs to place a new order (because there isn't one already open, or a pending order already exists), it places a "buy stop" order at the calculated "BuyPrice" and a "sell stop" order at the calculated "SellPrice".
In short, this script automates a trading strategy that involves placing pending orders based on moving averages, managing risk through stop losses and lot size calculations, and potentially maximizing profits through a trailing stop feature. It continually adjusts and manages these orders to adapt to changing market conditions.
//+------------------------------------------------------------------+
//| Copyright 2005, Gordago Software Corp. |
//| http://www.gordago.com/ |
//+------------------------------------------------------------------+
// I want to thank Michal Rutka, michal1@zonnet.nl, for helping me correct
// the mistakes that I made... Good Job!!
#property copyright "Provided by sencho, coded by don_forex"
#property link "http://www.gordago.com"
//----
extern int TakeProfit=850;
extern int TrailingStop=850;
extern int PipDifference=25;
extern double Lots=0.1;
extern double MaximumRisk=10;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int cnt, ticket;
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0);
}
string TradeSymbol=Symbol();
double MA144H=MathRound(iMA(NULL,0,144,0,MODE_EMA,PRICE_HIGH,0)/Point)*Point;
double MA144L=MathRound(iMA(NULL,0,144,0,MODE_EMA,PRICE_LOW,0)/Point)*Point;
double Spread=Ask-Bid; // MarketInfo(TradeSymbol,MODE_SPREAD);
double BuyPrice =MA144H + Spread+PipDifference*Point;
double BuyStopLoss =MA144L - Point;
double BuyTakeProfit=MA144H +(PipDifference+TakeProfit)*Point;
double SellPrice =MA144L -(PipDifference)*Point;
double SellStopLoss =MA144H + Spread+Point;
double SellTakeProfit= MA144L - Spread-(PipDifference+TakeProfit)*Point;
double lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/50000,1);
double close=iClose(NULL,0,0);
int total=OrdersTotal();
//----
bool need_long =true;
bool need_short=true;
// First update existing orders.
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==16384)
{
if(OrderType()==OP_BUYSTOP)
{
need_long=false;
if (OrderStopLoss()!=BuyStopLoss)
{
Print(BuyStopLoss, " ",OrderStopLoss());
OrderModify(OrderTicket(),BuyPrice,BuyStopLoss,BuyTakeProfit,0,Green);
}
}
if(OrderType()==OP_SELLSTOP)
{
need_short=false;
if (OrderStopLoss()!=SellStopLoss)
{
Print(SellStopLoss, " ",OrderStopLoss());
OrderModify(OrderTicket(),SellPrice,SellStopLoss,SellTakeProfit,0,Green);
}
}
if(OrderType()==OP_BUY)
{
need_long=false;
if (OrderStopLoss()<BuyStopLoss)
{
Print(BuyStopLoss, " ",OrderStopLoss());
OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopLoss,BuyTakeProfit,0,Green);
OrderDelete(OrderTicket());
}
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
if(OrderType()==OP_SELL)
{
need_short=false;
if (OrderStopLoss()>SellStopLoss)
{
Print(SellStopLoss, " ",OrderStopLoss());
OrderModify(OrderTicket(),OrderOpenPrice(),SellStopLoss,SellTakeProfit,0,Green);
OrderDelete(OrderTicket());
}
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
if(AccountFreeMargin()<(1000*lot))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (close<MA144H && close>MA144L)
{
if(need_long)
ticket=OrderSend(Symbol(),OP_BUYSTOP,lot,BuyPrice,3,BuyStopLoss,BuyTakeProfit,"Binario_v3",16384,0,Green);
if(need_short)
ticket=OrderSend(Symbol(),OP_SELLSTOP,lot,SellPrice,3,SellStopLoss,SellTakeProfit,"Binario_v3",16384,0,Red);
}
}
//+------------------------------------------------------------------+
Comments