FOR EXIT
/*
Plot(WMA(C,50),"",colorGold,styleThick|styleLine|styleDots);
Plot(WMA(C,100),"",colorBrightGreen,styleThick|styleLine|styleDashed);
Plot(WMA(C,170),"",colorYellow,styleLine);
Plot(WMA(C,200),"",colorRed,styleLine|styleThick);
//Plot(MA(C,10),"",colorAqua,styleLine);
Plot(MA(C,25),"",colorYellow,styleLine|styleDashed|styleThick);
*/
Prd1=Param("ATR Period",4,1,20,1);
Prd2=Param("Look Back",8,1,20,1);
green = HHV(LLV(L,Prd1)+ATR(Prd1),Prd2);
red = LLV(HHV(H,Prd1)-ATR(Prd1),Prd2);
HighClosePercent = (H - C)*100/H;
HighLowPercent = MA((H - L)*100/H,25);
barColor=IIf(C>Green ,colorBrightGreen,IIf(C < RED,colorRed,IIf(HighClosePercent>5,colorYellow,IIf(HighLowPercent>5 AND ROC(C,1,True)<-3,colorRed,colorWhite))));
SetBarFillColor( IIf(C>Green AND ROC(C,1,True)<-4.5,colorBlue,colorBlack));
flowerOpen = O;
flowerClose = C;
flowerHigh= H;
flowerLow = L;
_SECTION_BEGIN("Price");
PlotOHLC( IIf(flowerOpen<flowerClose, flowerOpen, flowerClose),flowerHigh,flowerLow,IIf(flowerOpen<flowerClose, flowerClose, flowerOpen), "Close", barColor, styleNoTitle | styleCandle);
//Plot (Close,"", IIf( C > O, ParamColor("Up Color", colorWhite ), ParamColor("Down Color", colorRed )),ParamStyle( "Style", styleCandle | styleThick, maskAll));
SetChartOptions(0,chartShowArrows|chartShowDates);
_SECTION_END();
_SECTION_BEGIN("Background");
SetChartOptions(0,chartShowArrows|chartShowDates);
if( ParamToggle("Tooltip shows", "All Values|Only Prices" ) )
{
ToolTip=StrFormat("Open: %g\nHigh: %g\nLow: %g\nClose: %g
(%.1f%%)\nVolume: "+NumToStr( V, 1 ), O, H, L, C, SelectedValue( ROC( C, 1
)));
}
SetChartBkColor(ParamColor("Outer panel color ",colorBlack)); // color of outer border
SetChartBkGradientFill( ParamColor("Inner panel color upper half",colorBlack),ParamColor("Inner panel color lower half",colorBlack),ParamColor("Titleblock",colorDarkGrey )); //color of inner panel
_SECTION_END();
{
// Data Path
DataPath1 = ParamStr("DataPath ","Data");
_N(DataPath = "mrtq13-"+DataPath1 +"\\"); //this is the folder where data is put
// Define Required Global Variables
global TrailBarStart,PeakValue,TrailStopValue,EvenStopPS,ProfitStopPS,MaxLossPS;
global TurnOver,TitleS,Qty,LeftoverCash,BuyValue,MarketValue,ReturnedTotalbuyprice,RawCashGain;
global CashReturned,TotalbuypriceGain,PSRequiredGain,EvenStopPC,TrailPercent,Title_1,Title_2;
global DBUY,TBUY,DSELL,TSELL,AlertByte,IDList,TotalEquity;
// Set Core Global Variables
_N(VersionStr="ManualStopSet V3.05");
SetBarsRequired(100000, 100000 );
BC = BarCount-1;
BNUM = BarIndex();
DNUM = DateNum();
TNUM = TimeNum();
FirstBarVis = Status("firstvisiblebar");
LastBarVis = Status("lastvisiblebar")-1;
SelectedBar = SelectedValue(BNUM);
AlertByte = 2; Title_1=""; Title_2="";Tally=0;
printf("SelectedBar:"+SelectedBar+"\n");
printf("BarCount:"+BC+"\n");
Overide="No"; //Diagnostics
// Load ID-List (Trade Lists)
// Make sure directory exists.
fmkdir(DataPath);
// Load ID-List.
IDList=""; // Ensure IDList is defined as a string. (If file not exist 1st run).
_N(IDListFile = DataPath + "ID-List");
fh = fopen( IDListFile, "r");
if( fh )
{// If exist, Get list.
IDList = fgets(fh);
fclose( fh );
}
else
{
IDList="<END>,"; // If not exist, Write File when we create a trade.
}
// Determin EOD(0) or IntraDay(1) mode
TimeFrame = Interval();
EODRT = IIf(TimeFrame>=inDaily,0,1);
// Set Parameters
// MSS Param
//TotalEquity = Param("TotalEquity",0,0,10000000,0.01);
BuyAt = Param("EntryPrice",0,0,10000,0.01);
TotalShare=Param("ShareQuantity",0,0,7000,1);
SellAtP = Param("ExitPrice",0,0,10000,0.01);
CommisionX1=0;//CommisionX1 = Param("Commision",0,0,3000,0.01);
StopLoss = Param("StopLoss",7,0,100,0.01); //Percentage of Cash
TrailStop = Param("Fixed TrailingStop",8,0,100,0.01); //Percentage of HH/LL
ProfitStop = Param("ProfitStop",10,0,100,0.01); //Percentage of Cash
HoldingsAdj = Param("HoldingsAdj",0,-100,100,1); //Adj Calc Holdings
MultiTrade = Param("MultiTrade",0,0,9,1); //View/Set Calcs for specific Multi Trade
CreateTrade = ParamTrigger("Create Trade","<Create>");
RemoveTrade = ParamTrigger("Modify Trade<R>","<Remove>");
CloseTrade = ParamTrigger("Modify Trade<C>","<Close>");
OpenTrade = ParamTrigger("Modify Trade<O>","<Re-Open>");
TradeType = ParamToggle( "Long/Short", "Long|Short",0);
//Totalbuyprice = Param("Totalbuyprice",300000,0,700000,0.01);
// CLA Param
DisplayPlot = ParamToggle("DisplayPlot","Single|Multi",0);
TitleStyleT = ParamList("DisplayText","Detail/Tally|Tally|Detail|None");
TitleSlide = Param("TitleSlide",1,0,30,1);
// Set Default BuyBar & BuyAt etc
SellAt=SellAtP;
if (SelectedBar == LastBarVis) SelectedBar = BC;
BuyBar = SelectedBar; SellBar=BC;
if (SellAt == 0) SellAt=C[SellBar];
if (BuyAt == 0) BuyAt=O[BuyBar];
}
///////////////////////////////////////////////////////////////////////
// End of Initialize
///////////////////////////////////////////////////////////////////////
_SECTION_BEGIN("Pivot");
nBars = Param("Number of bars", 15, 5, 40);
LP=Param("LookBack Period",250,1,500,1);
bShowTCZ = Param("Show TCZ", 0, 0, 1);
nExploreBarIdx = 0;
nExploreDate = 0;
nCurDateNum = 0;
DN = DateNum();
DT = DateTime();
bTCZLong = False;
bTCZShort = False;
nAnchorPivIdx = 0;
ADX8 = ADX(8);
if(Status("action")==1) {
bDraw = True;
bUseLastVis = 1;
} else {
bDraw = False;
bUseLastVis = False;
bTrace = 1;
nExploreDate = Status("rangetodate");
for (i=LastValue(BarIndex());i>=0;i--) {
nCurDateNum = DN;
if (nCurDateNum == nExploreDate) {
nExploreBarIdx = i;
}
}
}
GraphXSpace=7;
if (bDraw) {
}
aHPivs = H - H;
aLPivs = L - L;
aHPivHighs = H - H;
aLPivLows = L - L;
aHPivIdxs = H - H;
aLPivIdxs = L - L;
aAddedHPivs = H - H;
aAddedLPivs = L - L;
aLegVol = H - H;
aRetrcVol = H - H;
nHPivs = 0;
nLPivs = 0;
lastHPIdx = 0;
lastLPIdx = 0;
lastHPH = 0;
lastLPL = 0;
curPivBarIdx = 0;
aHHVBars = HHVBars(H, nBars);
aLLVBars = LLVBars(L, nBars);
aHHV = HHV(H, nBars);
aLLV = LLV(L, nBars);
nLastVisBar = LastValue(
Highest(IIf(Status("barvisible"), BarIndex(), 0)));
curBar = IIf(nlastVisBar > 0 AND bUseLastVis, nlastVisBar,
IIf(Status("action")==4 AND nExploreBarIdx > 0, nExploreBarIdx,
LastValue(BarIndex())));
curTrend = "";
if (aLLVBars[curBar] < aHHVBars[curBar])
curTrend = "D";
else
curTrend = "U";
if (curBar >= LP) {
for (i=0; i<LP; i++) {
curBar = IIf(nlastVisBar > 0 AND bUseLastVis,
nlastVisBar-i,
IIf(Status("action")==4 AND nExploreBarIdx > 0,
nExploreBarIdx-i,
LastValue(BarIndex())-i));
if (aLLVBars[curBar] < aHHVBars[curBar]) {
if (curTrend == "U") {
curTrend = "D";
curPivBarIdx = curBar - aLLVBars[curBar];
aLPivs[curPivBarIdx] = 1;
aLPivLows[nLPivs] = L[curPivBarIdx];
aLPivIdxs[nLPivs] = curPivBarIdx;
nLPivs++;
}
} else {
if (curTrend == "D") {
curTrend = "U";
curPivBarIdx = curBar - aHHVBars[curBar];
aHPivs[curPivBarIdx] = 1;
aHPivHighs[nHPivs] = H[curPivBarIdx];
aHPivIdxs[nHPivs] = curPivBarIdx;
nHPivs++;
}
}
}
}
curBar =
IIf(nlastVisBar > 0 AND bUseLastVis,
nlastVisBar,
IIf(Status("action")==4 AND nExploreBarIdx > 0,
nExploreBarIdx,
LastValue(BarIndex()))
);
if (nHPivs >= 2 AND nLPivs >= 2) {
lastLPIdx = aLPivIdxs[0];
lastLPL = aLPivLows[0];
lastHPIdx = aHPivIdxs[0];
lastHPH = aHPivHighs[0];
nLastHOrLPivIdx = Max(lastLPIdx, lastHPIdx);
nAddPivsRng = curBar - nLastHOrLPivIdx;
aLLVAfterLastPiv = LLV(L, nAddPivsRng);
nLLVAfterLastPiv = aLLVAfterLastPiv[curBar];
aLLVIdxAfterLastPiv = LLVBars(L, nAddPivsRng);
nLLVIdxAfterLastPiv = curBar - aLLVIdxAfterLastPiv[curBar];
aHHVAfterLastPiv = HHV(H, nAddPivsRng);
nHHVAfterLastPiv = aHHVAfterLastPiv[curBar];
aHHVIdxAfterLastPiv = HHVBars(H, nAddPivsRng);
nHHVIdxAfterLastPiv = curBar - aHHVIdxAfterLastPiv[curBar];
if (lastHPIdx > lastLPIdx) {
/* There are at least two possibilities here. One is that
the previous high was higher, indicating that this is a
possible short retracement or one in the making.
The other is that the previous high was lower, indicating
that this is a possible long retracement in the working.
However, both depend on opposing pivots. E.g., if I find
higher highs, what if I have lower lows?
If the highs are descending, then I can consider:
- a lower low, and leave it at that
- a higher high and higher low
- a lower low and another lower high
*/
if (aHPivHighs[0] < aHPivHighs[1]) {
if (nLLVAfterLastPiv < aLPivLows[0] AND
(nLLVIdxAfterLastPiv - lastHPIdx - 1) >= 1
AND nLLVIdxAfterLastPiv != curBar ) {
// -- OK, we'll add this as a pivot.
// Mark it for plotting...
aLPivs[nLLVIdxAfterLastPiv] = 1;
aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
// ...and then rearrange elements in the
// pivot information arrays
for (j=0; j<nLPivs; j++) {
aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
}
aLPivLows[0] = nLLVAfterLastPiv;
aLPivIdxs[0] = nLLVIdxAfterLastPiv;
nLPivs++;
// -- Test whether to add piv given last piv is high
// AND we have lower highs
}
// -- Here, the last piv is a high piv, and we have
// higher-highs. The most likely addition is a
// Low piv that is a retracement.
} else {
if (nLLVAfterLastPiv > aLPivLows[0] AND
(nLLVIdxAfterLastPiv - lastHPIdx - 1) >= 1
AND nLLVIdxAfterLastPiv != curBar ) {
// -- OK, we'll add this as a pivot.
// Mark it for plotting...
aLPivs[nLLVIdxAfterLastPiv] = 1;
aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
// ...and then rearrange elements in the
// pivot information arrays
for (j=0; j<nLPivs; j++) {
aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
}
aLPivLows[0] = nLLVAfterLastPiv;
aLPivIdxs[0] = nLLVIdxAfterLastPiv;
nLPivs++;
// -- Test whether to add piv given last piv is high
// AND we have lower highs
}
// -- The last piv is a high and we have higher highs
// OR lower highs
}
/* ****************************************************************
Still finding missed pivot(s). Here, the last piv is a low piv.
**************************************************************** */
} else {
// -- First case, lower highs
if (aHPivHighs[0] < aHPivHighs[1]) {
if (nHHVAfterLastPiv < aHPivHighs[0] AND
(nHHVIdxAfterLastPiv - lastLPIdx - 1) >= 1
AND nHHVIdxAfterLastPiv != curBar ) {
// -- OK, we'll add this as a pivot.
// Mark that for plotting
aHPivs[nHHVIdxAfterLastPiv] = 1;
aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
// ...and then rearrange elements in the
// pivot information arrays
for (j=0; j<nHPivs; j++) {
aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
}
aHPivHighs[0] = nHHVAfterLastPiv;
aHPivIdxs[0] = nHHVIdxAfterLastPiv;
nHPivs++;
// -- Test whether to add piv given last piv is high
// AND we have lower highs
}
// -- Second case when last piv is a low piv, higher highs
// Most likely addition is high piv that is a retracement.
// Considering adding a high piv as long as it is higher
} else {
// -- Where I have higher highs,
if (nHHVAfterLastPiv > aHPivHighs[0] AND
(nHHVIdxAfterLastPiv - lastLPIdx - 1) >= 1
AND nHHVIdxAfterLastPiv != curBar ) {
// -- OK, we'll add this as a pivot.
// Mark it for plotting...
aHPivs[nHHVIdxAfterLastPiv] = 1;
aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
// ...and then rearrange elements in the
// pivot information arrays
for (j=0; j<nHPivs; j++) {
aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
}
aHPivHighs[0] = nHHVAfterLastPiv;
aHPivIdxs[0] = nHHVIdxAfterLastPiv;
nHPivs++;
// -- Test whether to add piv given last piv is high
// AND we have lower highs
}
}
}
// -- If there are at least two of each
}
/* ****************************************
// -- Done with finding pivots
***************************************** */
if (bDraw) {
// -- OK, let's plot the pivots using arrows
PlotShapes( IIf(aHPivs==1, shapeDownArrow, shapeNone), colorRed, layer = 0, yposition = High, offset = -10);
//PlotShapes( IIf(aHPivs==1, shapeSmallSquare, shapeNone), colorBlack, layer = 0, yposition = High, offset = 12);
PlotShapes( IIf(aAddedHPivs==1, shapeDownArrow, shapeNone), colorRed,layer = 0, yposition = High, offset = -10);
//PlotShapes( IIf(aAddedHPivs==1, shapeSmallSquare, shapeNone), colorBlack, layer = 0, yposition = High, offset = 12);
//PlotShapes( IIf(aLPivs==1, shapeSmallSquare, shapeNone), colorBrightGreen, layer = 0, yposition = Low, offset = -9);
//PlotShapes( IIf(aLPivs==1, shapeSmallSquare, shapeNone), colorBlack, layer = 0, yposition = Low, offset = -12);
//PlotShapes( IIf(aAddedLPivs==1, shapeDownArrow, shapeNone), colorGold, layer = 0, yposition = Low, offset = -15);
//PlotShapes( IIf(aAddedLPivs==1, shapeSmallSquare, shapeNone), colorBlack, layer = 0, yposition = Low, offset = -13);
}
_SECTION_END();
///////////////////////////////////////////////////////////////////////
// Define Procedures/Functions
///////////////////////////////////////////////////////////////////////
procedure RemoveEntry(RemSym)
{
// Remove entry from IDList
NewIDList = "";
for( i = 0; ( sym = StrExtract( IDList, i ) ) != "<END>"; i++ )
{
if (sym != RemSym) {NewIDList = NewIDList + sym + ",";}
}
IDList = NewIDList+"<END>,";
fh = fopen( IDListFile, "w");
if( fh )
{
fputs( IDList , fh );
fclose( fh );
}
}
procedure AddEntry(AddSym)
{
// Add entry to IDList
IDList = AddSym + "," + IDList;
printf(IDList);
fh = fopen( IDListFile, "w");
if( fh )
{
fputs( IDList , fh );
fclose( fh );
}
}
procedure DoCalculation(Sym)
{
// All variables should be global
// printf("Calculating: "+Sym+"\n");
Turnover = (C*V); //For Display
// Manual Flip (If Sell Selected before buy)
// Mabie should also flip SellAt open/close.
if (SellBar < BuyBar)
{
BuyBar1 = BuyBar;BuyBar=SellBar;SellBar=BuyBar1;
BuyAt1 = BuyAt;BuyAt=SellAt;SellAt=BuyAt1;
}
// Calc Holding Stats
Totalbuyprice=TotalShare*BuyAt;
//CommisionX1=(Totalbuyprice*CommisionX1)/100;
FinalBuyValue=Totalbuyprice+CommisionX1;
// Calc Holding Stats
Avail = Totalbuyprice-CommisionX1;
Qty = (int(Avail/BuyAt))+HoldingsAdj;
BuyValue = Qty*BuyAt;
LeftoverCash = (Totalbuyprice-BuyValue)-CommisionX1;
MarketValue = Qty*SellAt;
RawCashGain = ((MarketValue)-(BuyValue))*((TradeType*-2)+1); //LongShortFlip
CashReturned = RawCashGain-(CommisionX1*2);
ReturnedTotalbuyprice = Totalbuyprice+CashReturned;
TotalbuypriceGain = (CashReturned/Totalbuyprice)*100; // Total Percent Gained
Trail_Ref = BC - SellBar;
Range_Ref = SellBar - BuyBar+1;
PeakValue = LastValue(Ref(HHV(H,Range_Ref),-Trail_Ref));
Peak_Ref = LastValue(Ref(HHVBars(H,Range_Ref),-Trail_Ref));
TrailBarStart = SellBar-Peak_Ref;
TrailStopValue = PeakValue - (PeakValue * (TrailStop/100));
TrailPercent = 100-((Close[SellBar]/PeakValue)*100);
// Calc Even Stop
EvenStopValue = (Qty*BuyAt) + (CommisionX1*2);
EvenStopPS = EvenStopValue/Qty;
EvenStopPC = ((EvenStopPS/Buyat)*100)-100;
// Calc Profit Stop
ProfitStopCalc = FinalBuyValue*(ProfitStop/100);
ProfitStopValue = FinalBuyValue+ ProfitStopCalc + (CommisionX1*2);
ProfitStopPS = ProfitStopValue/Qty;
PSRequiredGain = ((ProfitStopPS/BuyAt)*100)-100;
// Calc Loss Stop
MaxLossCalc = Totalbuyprice*(StopLoss/100);
MaxLossValue = Totalbuyprice- MaxLossCalc + (CommisionX1*2);
MaxLossPS = MaxLossValue/Qty;
}
procedure DisplayPlots(Sym,symid)
{
// Plot Vertical Buy Bar. (Blue)
VLine = IIf(BuyBar==BNUM,1,0);
//Plot (VLine ,"BuyBar", colorGrey40, styleHistogram | styleOwnScale,0,1);
// Plot Vertical Sell Bar. (Blue)
// VLine = IIf(SellBar==BNUM,1,0);
// Plot (VLine ,"BuyBar", colorBlue, styleHistogram | styleOwnScale,0,1);
//Plot MultiTrade Number
PlotText(symid,Buybar-1,ProfitStopPS,colorRed,colorWhite);
// Plot Horizontal Buy Bar. (Yellow)
x0 = Buybar ; y0 = BuyAt;
x1 = SellBar ; y1 = y0;
Hline = LineArray(x0,y0,x1,y1,0);
//Plot(HLine ,"BuyPrice",colorTeal ,ParamStyle("BuyStyle",styleLine|styleDashed,maskAll));
// Plot Trade Trend (BuyBar to SellBar/SellAT - Blue Dashed Line)
x0 = Buybar ; y0 = BuyAt;
x1 = Sellbar ; y1 = SellAt;
// y1 = C[Sellbar];
Hline = LineArray(x0,y0,x1,y1,0);
//Plot(HLine ,"TradeTrend",colorOrange,styleLine|styleDashed);
// Plot Long/Short Trail Stop Trend
x0 = TrailBarStart; y0=PeakValue;
x1 = SellBar; y1 = C[SellBar];
Line = IIf((X1 > X0),LineArray(x0,y0,x1,y1,0),LineArray(x1,y1,x0,y0,0) ); //Reverse
//Plot(Line,"TrailStop",colorViolet,styleLine|styleDots);
// Plot TrailStop Horizontal (ColorViolet)
x0 = Buybar ; y0 = TrailStopValue;
x1 = SellBar ; y1=y0;
Hline = LineArray(x0,y0,x1,y1,0);
Plot(HLine ,"TrailStop",ParamColor( "TrailStopColor", colorSeaGreen ),ParamStyle("TrailStopStyle",styleDashed|styleThick,maskAll));;
// Plot BreakEven Horizontal (ColorGreen)
x0 = Buybar ; y0 = EvenStopPS;
x1 = SellBar ; y1=y0;
Hline = LineArray(x0,y0,x1,y1,0);
Plot(HLine ,"EvenStop",ParamColor( "EvenStopColor", colorGrey50 ),ParamStyle("EvenStopStyle",styleLine|styleDashed|styleStaircase|styleThick|StyleHidden,maskAll));
// Plot ProfitStop Horizontal (ColorWhite)
x0 = Buybar ; y0 = ProfitStopPS ;
x1 = SellBar ; y1=y0;
Hline = LineArray(x0,y0,x1,y1,0);
Plot(HLine ,"ProfitStop",ParamColor( "ProfitStopColor", colorWhite ),ParamStyle("ProfitStopStyle",styleLine|styleStaircase|styleThick|StyleHidden,maskAll));
// Plot LossStop Horizontal (ColorRed)
x0 = Buybar ; y0 = MaxLossPS;
x1 = SellBar ; y1=y0;
Hline = LineArray(x0,y0,x1,y1,0);
Plot(HLine ,"StopLoss",ParamColor( "StopLossColor", colorRed ),ParamStyle("StopLossStyle",styleLine|styleStaircase|styleThick,maskAll));
}// End DisplayPlots
WorkingDays = SellBar - BuyBar+1;//(SellBar-BuyBar);
Maturestock = WorkingDays>=4;
Immaturestock = WorkingDays<4;
Totalbuyprice=TotalShare*BuyAt;
//CommisionX1=(Totalbuyprice*CommisionX1)/100;
FinalBuyValue=Totalbuyprice+CommisionX1;
procedure CreateTitleDetail(Sym)
{
// Create Title Detail
ssd = StrFormat("%.0f",DNUM[BuyBar]);
ssD = StrRight(ssD,6);
ssD = StrRight(ssD,2)+"-"+StrLeft(StrRight(ssD,4),2)+"-20"+StrLeft(ssD,2);
_N(BuyDate = ssD );
//_N(BuyDate = StrLeft(ssD,10));
//_N(BuyDate = StrFormat("%.0f",DNUM[BuyBar]));
_N(BuyTime = StrFormat("%.0f",TNUM[BuyBar]));
_N(SellDate = StrFormat("%.0f",DNUM[SellBar]));_N(SellTime = StrFormat("%.0f",TNUM[SellBar]));
_N(Title_1 = ""+
"\\c11 BuyDate: \\c11"+ BuyDate +//"/" + BuyTime +
//"\n\\c29 SellBar: \\c23"+ SellBar+"\\c29 SellDT: \\c23"+ SellDate + "/" + SellTime +
//"\n\\c38 Commision \\c38"+CommisionX1+
"\n\\c34 Entry Price: \\c34"+BuyAt+
//"\n\\c38 SellAt \\c01"+SellAt+
"\n\\c33 Share Quantity: \\c33"+TotalShare+
"\n\\c36 TotalBuyPrice: \\c36"+Totalbuyprice+
"\n"+EncodeColor(colorRose)+"-------------------------"
+
//"\n\\c21 BuyValue with Commission: \\c01: "+FinalBuyValue+
//"\n\\c21 LeftoverCash \\c01: "+LeftoverCash+
"\n\\c25 Current MarketValue \\c25: "+MarketValue/100+
"\n\\c54 Profit Gain \\c54: "+RawCashGain+
//"\n\\c21 CashReturned \\c01: "+ CashReturned +
//"\n\\c21 ReturnedTotalbuyprice \\c01: "+ReturnedTotalbuyprice+
"\n\\c48 Profit Percentage \\c48: "+TotalbuypriceGain+"%"+
"\n"+EncodeColor(colorRose)+"-------------------------"
+
//"\n\\c21 PSRequiredGain \\c01: "+PSRequiredGain+"%"+
//"\n\\c29 EvenStop : " + Prec(EvenStopPC,4) + "%, " + EvenStopPS +
"\n\\c44 ProfitTaking: " + ProfitStop + "%, " + ProfitStopPS +
"\n\\c07 StopLoss : " + StopLoss + "%, " + MaxLossPS +
"\n\\c51 TrailStop: \\c51" + TrailStop + "%, " + TrailStopValue +
//"\n\\c08 Working Days " +"\\c02@ \\c07" + WorkingDays+WriteIf(Maturestock," \\c08[Mature]"," ")+WriteIf(Immaturestock,"\\c04[Immature]"," ")+
"\n"+EncodeColor(colorRose)+"-------------------------"
+
//"\n\\c29 TrailVariance: \\c01" +TrailPercent + "% "+
"");
}// End CreateTitle
Totalbuyprice=TotalShare*BuyAt;
CommisionX1=(Totalbuyprice*CommisionX1)/100;
FinalBuyValue=Totalbuyprice+CommisionX1;
procedure LoadID(FileName)
{// Load ID
printf("loading: '"+FileName+"'\n");
fh = fopen( FileName, "r");
if( fh )
{// File open for read
TradeType = StrToNum(fgets( fh ));
TotalShare= StrToNum(fgets( fh ));
//StopLoss=StrToNum(fgets( fh ));
TimeFrame = StrToNum(fgets( fh ));
DBUY = StrToNum(fgets( fh ));
TBUY = StrToNum(fgets( fh ));
DSELL = StrToNum(fgets( fh ));
TSELL = StrToNum(fgets( fh ));
BuyAt = StrToNum(fgets( fh ));
SellAt = StrToNum(fgets( fh ));
HoldingsAdj = StrToNum(fgets( fh ));
ProfitStop = StrToNum(fgets( fh ));
StopLoss = StrToNum(fgets( fh ));
TrailStop = StrToNum(fgets( fh ));
Totalbuyprice = StrToNum(fgets( fh ));
CommisionX1= StrToNum(fgets( fh ));
AlertByte = StrToNum(fgets( fh ));
fclose( fh );
TitleS="ReadFile";
}// End file open for read
else
{// File not found
printf("File Not Found\n");
TitleS="Error";
}// End file not found
}// End Load ID
procedure SaveID(FileName)
{// Write ID
printf("saving: '"+FileName+"'\n");
fh = fopen( FileName, "w");
if( fh )
{// File open for write
fputs( StrFormat("%.00f\n",TradeType ), fh );
//fputs( StrFormat("%.00f\n",StopLoss ), fh );
fputs( StrFormat("%.00f\n",TotalShare), fh );
fputs( StrFormat("%.00f\n",TimeFrame ), fh );
fputs( StrFormat("%.00f\n",DBUY ), fh );
fputs( StrFormat("%.00f\n",TBUY ), fh );
fputs( StrFormat("%.00f\n",DSELL ), fh );
fputs( StrFormat("%.00f\n",TSELL ), fh );
fputs( StrFormat("%.02f\n",BuyAt ), fh );
fputs( StrFormat("%.02f\n",SellAt ), fh );
fputs( StrFormat("%.02f\n",HoldingsAdj ), fh );
fputs( StrFormat("%.02f\n",ProfitStop ), fh );
fputs( StrFormat("%.02f\n",StopLoss ), fh );
fputs( StrFormat("%.02f\n",TrailStop ), fh );
fputs( StrFormat("%.02f\n",Totalbuyprice ), fh );
fputs( StrFormat("%.02f\n",CommisionX1 ), fh );
fputs( StrFormat("%.00f\n",AlertByte ), fh );
fclose( fh );
TitleS = "SaveFile";
}// End File open for write
}// End WriteID
///////////////////////////////////////////////////////////////////////
// End Define Procedures/Functions
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// Start core section.
///////////////////////////////////////////////////////////////////////
{
if (OpenTrade == 1)
{// Open trade.
AlertIf( 1, "", "Open trade", 0,3 );
IDName = Name()+"-"+MultiTrade;
TrailName = DataPath + IDName;
LoadID(TrailName);
SellAt=0;DSELL=0;TSELL=0;
SaveID(TrailName);
}// End Open trade
if (CloseTrade == 1)
{// Close trade.
AlertIf( 1, "", "Close trade", 0,3 );
IDName = Name()+"-"+MultiTrade;
TrailName = DataPath + IDName;
LoadID(TrailName);
DSELL = DNUM[SelectedBar];TSELL = TNUM[SelectedBar];
SellAt=C[SelectedBar];
if (SellAtP != 0) {SellAt=SellAtP;}
SaveID(TrailName);
}// End Close trade
if (RemoveTrade == 1)
{// Remove Entry
AlertIf( 1, "", "Remove trade", 0,3 );
IDName = Name()+"-"+MultiTrade;
RemoveEntry(IDName);
}// End Remove Entry
if (CreateTrade == 1)
{// Write Data
AlertIf( 1, "", "Write trade", 0,3 );
// Set name & add to master index
IDName = Name()+"-"+MultiTrade;
RemoveEntry(IDName);
AddEntry(IDName);
TrailName = DataPath + IDName;
// Write data to file
DBUY = DNUM[BuyBar]; TBUY = TNUM[BuyBar];
DSELL = 0; TSELL = 0; SellAT = 0;
TotalEquity = 0;
SaveID(TrailName);
}// End Write data
// Calc & Display
IDName = Name()+"-"+MultiTrade;
printf("Current: "+IDName+"\n\n");
// Create Title Tally Header.
Title_2 = "-------------------------\n";//"\\c09 SYMBOLS- GAIN\n\n";
if (DisplayPlot == 0)
{// DisplayPlot
// Plot Price & Volume.
PlotForeign( GetBaseIndex(), GetBaseIndex(), colorAqua, styleLine | styleOwnScale);
//Plot( Volume, _DEFAULT_NAME(), colorBlueGrey , styleHistogram | styleOwnScale | styleThick );
if (StrFind(IDList,Name()) == 0)
{// Symbol not found in IDList, use selected.
TitleS="NoFile";
DoCalculation(Name());
DisplayPlots(Name(),"");
CreateTitleDetail(Name());
}// End Symbol not found
else
{// Symbol found in IDList.
if (StrFind(IDList,IDName) == 0)
{// Exact symbol not found in IDList, use selected.
TitleS="NoFile";
DoCalculation(Name());
DisplayPlots(Name(),"");
CreateTitleDetail(Name());
}// End Exact symbol not found
}// End Symbol found
}// End DisplayPlot
flagX = 0;
for( i = 0; ( sym = StrExtract( IDList, i ) ) != "<END>"; i++ )
{// Loop
TrailName = DataPath + sym;
symleft = StrLeft(sym, StrFind(sym,"-")-1); CurrentSym = Name();
symid = StrRight(sym, StrLen(sym)-StrFind(sym,"-"));
// printf("SymLeft: "+symleft+" Current: "+CurrentSym+"\n\n");
// Set Ticker/Trade Environment.
SetForeign(symleft);
// Load & Do Calculation
LoadID(TrailName);
TimeFrameSet(TimeFrame); // after load
//BuyBar = DBUY;
// Calc Buy & Sell Bar
// BuyBar = LastValue(DBUY)+LastValue(Cum((DBUY==DBUY) AND (DBUY<DBUY)));
//BuyBar = LastValue(DBUY,True);
BuyBar = LastValue(Cum(DNUM<DBUY))+LastValue(Cum((DNUM==DBUY) AND (TNUM<TBUY)));
SellBar = LastValue(Cum(DNUM<DSELL))+LastValue(Cum((DNUM==DSELL) AND (TNUM<TSELL)));
XBar = SellBar ;
// Overide Sell
//if ( (SelectedBar != BC) AND (sym == IDName ) AND (TitleS != "Error"))
{SellBar = SelectedBar; SellAt = Close[SellBar];Overide=" @ "+SellBar+" $"+SellAt;}
if (SellBar == 0) {SellBar=BC; SellAt = Close[SellBar];}
// Use loaded Sell Price
if (sym == IDName)
{// Exact match, Overide Sell Price.
if (SellAtP != 0) {SellAt = SellAtP;}
}// End Exact match
// Do the Trade Calcs
DoCalculation(sym); //Doesn't actualy use passed symbol.
// Determine Stops from LastBar/SelectedBar LongMode
ProfitStopFlag = IIf( C[SellBar] >= ProfitStopPS ,True,False);
EvenStopFlag = IIf( C[SellBar] >= EvenStopPS,True,False);
StopLossFlag = IIf( C[SellBar] <= MaxLossPS,True,False);
TrailStopFlag = IIf(TrailPercent >= TrailStop,True,False);
// Generate Alerts Strings for Display
PSD = WriteIf(ProfitStopFlag,"\\c15# ","\\c01. ");
ESD = WriteIf(EvenStopFlag,"\\c15# ","\\c01. ");
LSD = WriteIf(StopLossFlag,"\\c15# ","\\c01. ");
TSD = WriteIf(TrailStopFlag,"\\c15# ","\\c01. ");
WorkingDays = SellBar - BuyBar+1;
NDays = XBar - BuyBar+1;
BeforeEntry = DBUY > DNUM ;
WorkingDays = IIf(BeforeEntry,-1 * (WorkingDays -1),WorkingDays );
Maturestock = WorkingDays>=4;
BuyingDay = WorkingDays==1;
Immaturestock = WorkingDays<4 AND DBUY<=DNUM AND WorkingDays!=1;
MatureString ="\\c08 [Days" +"\\c02@\\c07" + WorkingDays+"] "+WriteIf(Maturestock," \\c08[Mature]","")+WriteIf(Immaturestock,"\\c04[Immature]","")+WriteIf(BuyingDay ,"\\c52[BuyingDay]","")+WriteIf(BeforeEntry ,"\\c04[BeforeEntry]","");
//MatureString =StrFormat(" %.0f ",DBUY)+ StrFormat(" %.0f ",SellBar )+"\\c08 [Days" +"\\c02@\\c07" + WorkingDays+"] "+WriteIf(Maturestock," \\c08[Mature]"," ")+WriteIf(Immaturestock,"\\c04[Immature]"," ")+WriteIf(BeforeEntry ,"\\c04[BeforeEntry]"," ");
if(flagX ==0){
nid = sym ;
}
if (sym == IDName)
{
flagX = 1;
nid = IDName;
en = BuyAt;
wd = StrToNum(StrFormat("%.0f",NDays ));
awd = StrToNum(StrFormat("%.0f",WorkingDays));
}
sss = StrFormat("%.0f",DBUY );
sss = StrRight(sss,6);
sss = StrRight(sss,2)+"-"+StrLeft(StrRight(sss,4),2)+"-20"+StrLeft(sss,2)+"] " + MatureString ;
// Create Title Tally Strings
ListAlerts = PSD + ESD + LSD + TSD; Tally = Tally + CashReturned;
Title_2 = Title_2 + " \\c02" + StrLeft(sym,StrLen(sym)-2) +
": [Buy " + sss + ""+
"\n\\c41 Entry @ "+BuyAt+
"\\c10 -- \\c33 NOS: \\c33"+TotalShare+
"\\c10 --\\c36 Value: \\c36"+Totalbuyprice+
"\n\\c44 Profit $" + StrFormat("%08.2f",CashReturned) + " \\c51 Percent: " + StrFormat("%+06.2f",TotalbuypriceGain) + "%\n"+
//"\\c44 ProfitTaking: " + ProfitStop + "%, " + ProfitStopPS + " \\c07 StopLoss : " + StopLoss + "%, " + MaxLossPS + " \\c51 TrailStop: \\c51" + TrailStop + "%, " + TrailStopValue +
//"\n"+
EncodeColor(colorRose)+"-------------------------\n";
if (sym == IDName)
{// Exact match, Create title.
CreateTitleDetail(sym);
}// End Exact match
// Select Plot Display
if (DisplayPlot == 1) {Plot(C,"Close:"+symleft,i+16,styleLine | styleOwnScale);}
if ((DisplayPlot == 0) AND (symleft == CurrentSym)) {DisplayPlots(sym,symid);}
// Cleanup
TimeFrameRestore();
RestorePriceArrays();
}// End loop
// End of Calc & Display
// Dynamic Title
TSpace = "";
for( i = 0; i<TitleSlide ; i++ ) {TSpace = TSpace + "\n";}
HighLowPercent_2 = (H - L)*100/H;
MAHighClosePercent = MA((H - C)*100/H,64);
Title_Header =Name()+ " "+ WriteVal( SelectedValue( DateTime() ), formatDateTime) + " Open - "+O + " High - "+ H + " Low - "+ L +" Close - "+C + StrFormat(" (%.1f%%) ", SelectedValue( ROC( C, 1 ) )) +
"\nVolume - " +V + " "+StrFormat("(%.1f%%) ", SelectedValue(ROC(V,1))) +" Average Volume(12) - " + MA(V,12) +
"\nHC : "+StrFormat("(%.1f%%) ", HighClosePercent ) +" AHC(64): "+StrFormat("(%.1f%%) ", MAHighClosePercent )+
" AHL(25): "+StrFormat("(%.1f%%) ", HighLowPercent )+ " H-L: "+StrFormat("(%.1f%%) ", HighLowPercent_2 )+ "\\c36";
Title_NetProfitLoss = "-------------------------\n"+"\\c45 Net Profit/Loss : " + Tally + " " +EncodeColor(colorRose)+"\n";
Title_1 = "";
if (TitleStyleT == "Detail")
{Title = Title_Header + Title_1;}
if (TitleStyleT == "Tally")
{Title = Title_Header + Title_2 + "\\c09 Tally:$" + Tally + " " ;}
if (TitleStyleT == "Detail/Tally")
{Title = Title_Header + Title_1+ "\n" + Title_NetProfitLoss + Title_2 ;}
if (TitleStyleT == "None")
{Title = Title_Header ;}
// End Dynamic Title
}
if(flagX ==0){
nid = sym ;
}
///////////////////////////////////////////////////////////////////////
// End Core Section.
///////////////////////////////////////////////////////////////////////
_SECTION_END();
nid = StrLeft(nid ,StrLen(nid )-2);
xid = Name();
if(nid == xid){
if(awd <0){
wd = wd+awd;
}
wd = wd*(-1);
for( i = 0; i<BarCount; i++ ){
local_C = C[wd];
}
for( i = wd; i<BarCount; i++ ){
local_C = C;
}
}
else{
nid = "";
}
z = BarIndex();
tz = StrFormat("%.0f",z);
zt = StrToNum(tz);
/*
MyATR=ATR(14);//Enter ATR Average or use the 14 Day Moving Average of ATR
MidRange=(H+L)/2;//Figure Used In Title for Middle of Trading Range
if(nid == xid){
Plot (local_C- (MyATR*2),"",IIf(z<=wd-2,colorBlack,colorWhite), styleLine);
Plot (local_C- (MyATR*1.5),"",IIf(z<=wd-2,colorBlack,colorWhite), styleLine);
Plot (local_C- (MyATR*3),"",IIf(z<=wd-2,colorBlack,colorWhite),styleLine);
}
*/
/*
_SECTION_BEGIN("Stop loss7");
lookbackPeriod7 = Param("Lookback period7", 20, 7, 30);
stoplossPercentage7 = 7;//Param("Stoploss Percentage7", 7, 7, 10);
if(nid == xid){
Plot(HHV(local_C,lookbackPeriod7) - HHV(local_C,lookbackPeriod7) * (stoplossPercentage7 / 100), "Trailing stoploss7", IIf(z<=wd-2,colorBlack,colorRed), styleDashed|styleThick,0,0,0);
}
_SECTION_END();
_SECTION_BEGIN("Stop loss5");
lookbackPeriod5 = Param("Lookback period5", 20, 5, 30);
stoplossPercentage5 = 5;//Param("Stoploss Percentage5", 5, 2, 10);
if(nid ==xid){
Plot(HHV(local_C,lookbackPeriod5) - HHV(local_C,lookbackPeriod5) * (stoplossPercentage5 / 100), "Trailing stoploss5", IIf(z<=wd-2,colorBlack,colorYellow), styleDashed|styleThick,0,0,0);
}
_SECTION_END();
*/
_SECTION_BEGIN("Stoploss Line");
if(nid == xid){
mf = Param("ATR multiplier",3,1,5,0.25);
ap=Param("ATR Period",10,5,30,1);
Lb=20;//Param("Lookback Period",20,10,40,1);
ps=1;//ParamToggle("Use last low pivot","Use,Dont",1);
//p1=ParamToggle("plot type","line,Dots",1);
t1=HHV(local_C,Lb);
t2=(mf*ATR(ap));
t3=Trough(local_C,2,1);
t4=t1-t2;
t5=Min(t4,t3);
if(ps)
{
t6 = t1-t2;
}
else
{
t6=t5;
}
initial=t6;
stop[ 0 ] = local_C[ 0 ];
for( i = 1 ; i < BarCount; i++)
{
if( local_C[ i ] > stop[ i - 1])
{
temp = t6[ i ];
if( temp > stop[ i - 1 ] ) stop[ i ] = temp;
else stop[ i ] = stop[ i - 1 ];
}
else
stop[ i ] = initial[ i ];
}
Plot(stop,"ATR Stop",IIf(z<=wd-2,colorBlack,ParamColor( "Color", colorLightYellow)),IIf(wd<0,styleNoDraw,styleLine|styleDots|styleNoTitle));
}
/////////////////here ATR ends////////////////////////////////////
_SECTION_END();
/*
Plot(WMA(C,50),"",colorGold,styleThick|styleLine|styleDots);
Plot(WMA(C,100),"",colorBrightGreen,styleThick|styleLine|styleDashed);
Plot(WMA(C,170),"",colorYellow,styleLine);
Plot(WMA(C,200),"",colorRed,styleLine|styleThick);
//Plot(MA(C,10),"",colorAqua,styleLine);
Plot(MA(C,25),"",colorYellow,styleLine|styleDashed|styleThick);
*/
Prd1=Param("ATR Period",4,1,20,1);
Prd2=Param("Look Back",8,1,20,1);
green = HHV(LLV(L,Prd1)+ATR(Prd1),Prd2);
red = LLV(HHV(H,Prd1)-ATR(Prd1),Prd2);
HighClosePercent = (H - C)*100/H;
HighLowPercent = MA((H - L)*100/H,25);
barColor=IIf(C>Green ,colorBrightGreen,IIf(C < RED,colorRed,IIf(HighClosePercent>5,colorYellow,IIf(HighLowPercent>5 AND ROC(C,1,True)<-3,colorRed,colorWhite))));
SetBarFillColor( IIf(C>Green AND ROC(C,1,True)<-4.5,colorBlue,colorBlack));
flowerOpen = O;
flowerClose = C;
flowerHigh= H;
flowerLow = L;
_SECTION_BEGIN("Price");
PlotOHLC( IIf(flowerOpen<flowerClose, flowerOpen, flowerClose),flowerHigh,flowerLow,IIf(flowerOpen<flowerClose, flowerClose, flowerOpen), "Close", barColor, styleNoTitle | styleCandle);
//Plot (Close,"", IIf( C > O, ParamColor("Up Color", colorWhite ), ParamColor("Down Color", colorRed )),ParamStyle( "Style", styleCandle | styleThick, maskAll));
SetChartOptions(0,chartShowArrows|chartShowDates);
_SECTION_END();
_SECTION_BEGIN("Background");
SetChartOptions(0,chartShowArrows|chartShowDates);
if( ParamToggle("Tooltip shows", "All Values|Only Prices" ) )
{
ToolTip=StrFormat("Open: %g\nHigh: %g\nLow: %g\nClose: %g
(%.1f%%)\nVolume: "+NumToStr( V, 1 ), O, H, L, C, SelectedValue( ROC( C, 1
)));
}
SetChartBkColor(ParamColor("Outer panel color ",colorBlack)); // color of outer border
SetChartBkGradientFill( ParamColor("Inner panel color upper half",colorBlack),ParamColor("Inner panel color lower half",colorBlack),ParamColor("Titleblock",colorDarkGrey )); //color of inner panel
_SECTION_END();
{
// Data Path
DataPath1 = ParamStr("DataPath ","Data");
_N(DataPath = "mrtq13-"+DataPath1 +"\\"); //this is the folder where data is put
// Define Required Global Variables
global TrailBarStart,PeakValue,TrailStopValue,EvenStopPS,ProfitStopPS,MaxLossPS;
global TurnOver,TitleS,Qty,LeftoverCash,BuyValue,MarketValue,ReturnedTotalbuyprice,RawCashGain;
global CashReturned,TotalbuypriceGain,PSRequiredGain,EvenStopPC,TrailPercent,Title_1,Title_2;
global DBUY,TBUY,DSELL,TSELL,AlertByte,IDList,TotalEquity;
// Set Core Global Variables
_N(VersionStr="ManualStopSet V3.05");
SetBarsRequired(100000, 100000 );
BC = BarCount-1;
BNUM = BarIndex();
DNUM = DateNum();
TNUM = TimeNum();
FirstBarVis = Status("firstvisiblebar");
LastBarVis = Status("lastvisiblebar")-1;
SelectedBar = SelectedValue(BNUM);
AlertByte = 2; Title_1=""; Title_2="";Tally=0;
printf("SelectedBar:"+SelectedBar+"\n");
printf("BarCount:"+BC+"\n");
Overide="No"; //Diagnostics
// Load ID-List (Trade Lists)
// Make sure directory exists.
fmkdir(DataPath);
// Load ID-List.
IDList=""; // Ensure IDList is defined as a string. (If file not exist 1st run).
_N(IDListFile = DataPath + "ID-List");
fh = fopen( IDListFile, "r");
if( fh )
{// If exist, Get list.
IDList = fgets(fh);
fclose( fh );
}
else
{
IDList="<END>,"; // If not exist, Write File when we create a trade.
}
// Determin EOD(0) or IntraDay(1) mode
TimeFrame = Interval();
EODRT = IIf(TimeFrame>=inDaily,0,1);
// Set Parameters
// MSS Param
//TotalEquity = Param("TotalEquity",0,0,10000000,0.01);
BuyAt = Param("EntryPrice",0,0,10000,0.01);
TotalShare=Param("ShareQuantity",0,0,7000,1);
SellAtP = Param("ExitPrice",0,0,10000,0.01);
CommisionX1=0;//CommisionX1 = Param("Commision",0,0,3000,0.01);
StopLoss = Param("StopLoss",7,0,100,0.01); //Percentage of Cash
TrailStop = Param("Fixed TrailingStop",8,0,100,0.01); //Percentage of HH/LL
ProfitStop = Param("ProfitStop",10,0,100,0.01); //Percentage of Cash
HoldingsAdj = Param("HoldingsAdj",0,-100,100,1); //Adj Calc Holdings
MultiTrade = Param("MultiTrade",0,0,9,1); //View/Set Calcs for specific Multi Trade
CreateTrade = ParamTrigger("Create Trade","<Create>");
RemoveTrade = ParamTrigger("Modify Trade<R>","<Remove>");
CloseTrade = ParamTrigger("Modify Trade<C>","<Close>");
OpenTrade = ParamTrigger("Modify Trade<O>","<Re-Open>");
TradeType = ParamToggle( "Long/Short", "Long|Short",0);
//Totalbuyprice = Param("Totalbuyprice",300000,0,700000,0.01);
// CLA Param
DisplayPlot = ParamToggle("DisplayPlot","Single|Multi",0);
TitleStyleT = ParamList("DisplayText","Detail/Tally|Tally|Detail|None");
TitleSlide = Param("TitleSlide",1,0,30,1);
// Set Default BuyBar & BuyAt etc
SellAt=SellAtP;
if (SelectedBar == LastBarVis) SelectedBar = BC;
BuyBar = SelectedBar; SellBar=BC;
if (SellAt == 0) SellAt=C[SellBar];
if (BuyAt == 0) BuyAt=O[BuyBar];
}
///////////////////////////////////////////////////////////////////////
// End of Initialize
///////////////////////////////////////////////////////////////////////
_SECTION_BEGIN("Pivot");
nBars = Param("Number of bars", 15, 5, 40);
LP=Param("LookBack Period",250,1,500,1);
bShowTCZ = Param("Show TCZ", 0, 0, 1);
nExploreBarIdx = 0;
nExploreDate = 0;
nCurDateNum = 0;
DN = DateNum();
DT = DateTime();
bTCZLong = False;
bTCZShort = False;
nAnchorPivIdx = 0;
ADX8 = ADX(8);
if(Status("action")==1) {
bDraw = True;
bUseLastVis = 1;
} else {
bDraw = False;
bUseLastVis = False;
bTrace = 1;
nExploreDate = Status("rangetodate");
for (i=LastValue(BarIndex());i>=0;i--) {
nCurDateNum = DN;
if (nCurDateNum == nExploreDate) {
nExploreBarIdx = i;
}
}
}
GraphXSpace=7;
if (bDraw) {
}
aHPivs = H - H;
aLPivs = L - L;
aHPivHighs = H - H;
aLPivLows = L - L;
aHPivIdxs = H - H;
aLPivIdxs = L - L;
aAddedHPivs = H - H;
aAddedLPivs = L - L;
aLegVol = H - H;
aRetrcVol = H - H;
nHPivs = 0;
nLPivs = 0;
lastHPIdx = 0;
lastLPIdx = 0;
lastHPH = 0;
lastLPL = 0;
curPivBarIdx = 0;
aHHVBars = HHVBars(H, nBars);
aLLVBars = LLVBars(L, nBars);
aHHV = HHV(H, nBars);
aLLV = LLV(L, nBars);
nLastVisBar = LastValue(
Highest(IIf(Status("barvisible"), BarIndex(), 0)));
curBar = IIf(nlastVisBar > 0 AND bUseLastVis, nlastVisBar,
IIf(Status("action")==4 AND nExploreBarIdx > 0, nExploreBarIdx,
LastValue(BarIndex())));
curTrend = "";
if (aLLVBars[curBar] < aHHVBars[curBar])
curTrend = "D";
else
curTrend = "U";
if (curBar >= LP) {
for (i=0; i<LP; i++) {
curBar = IIf(nlastVisBar > 0 AND bUseLastVis,
nlastVisBar-i,
IIf(Status("action")==4 AND nExploreBarIdx > 0,
nExploreBarIdx-i,
LastValue(BarIndex())-i));
if (aLLVBars[curBar] < aHHVBars[curBar]) {
if (curTrend == "U") {
curTrend = "D";
curPivBarIdx = curBar - aLLVBars[curBar];
aLPivs[curPivBarIdx] = 1;
aLPivLows[nLPivs] = L[curPivBarIdx];
aLPivIdxs[nLPivs] = curPivBarIdx;
nLPivs++;
}
} else {
if (curTrend == "D") {
curTrend = "U";
curPivBarIdx = curBar - aHHVBars[curBar];
aHPivs[curPivBarIdx] = 1;
aHPivHighs[nHPivs] = H[curPivBarIdx];
aHPivIdxs[nHPivs] = curPivBarIdx;
nHPivs++;
}
}
}
}
curBar =
IIf(nlastVisBar > 0 AND bUseLastVis,
nlastVisBar,
IIf(Status("action")==4 AND nExploreBarIdx > 0,
nExploreBarIdx,
LastValue(BarIndex()))
);
if (nHPivs >= 2 AND nLPivs >= 2) {
lastLPIdx = aLPivIdxs[0];
lastLPL = aLPivLows[0];
lastHPIdx = aHPivIdxs[0];
lastHPH = aHPivHighs[0];
nLastHOrLPivIdx = Max(lastLPIdx, lastHPIdx);
nAddPivsRng = curBar - nLastHOrLPivIdx;
aLLVAfterLastPiv = LLV(L, nAddPivsRng);
nLLVAfterLastPiv = aLLVAfterLastPiv[curBar];
aLLVIdxAfterLastPiv = LLVBars(L, nAddPivsRng);
nLLVIdxAfterLastPiv = curBar - aLLVIdxAfterLastPiv[curBar];
aHHVAfterLastPiv = HHV(H, nAddPivsRng);
nHHVAfterLastPiv = aHHVAfterLastPiv[curBar];
aHHVIdxAfterLastPiv = HHVBars(H, nAddPivsRng);
nHHVIdxAfterLastPiv = curBar - aHHVIdxAfterLastPiv[curBar];
if (lastHPIdx > lastLPIdx) {
/* There are at least two possibilities here. One is that
the previous high was higher, indicating that this is a
possible short retracement or one in the making.
The other is that the previous high was lower, indicating
that this is a possible long retracement in the working.
However, both depend on opposing pivots. E.g., if I find
higher highs, what if I have lower lows?
If the highs are descending, then I can consider:
- a lower low, and leave it at that
- a higher high and higher low
- a lower low and another lower high
*/
if (aHPivHighs[0] < aHPivHighs[1]) {
if (nLLVAfterLastPiv < aLPivLows[0] AND
(nLLVIdxAfterLastPiv - lastHPIdx - 1) >= 1
AND nLLVIdxAfterLastPiv != curBar ) {
// -- OK, we'll add this as a pivot.
// Mark it for plotting...
aLPivs[nLLVIdxAfterLastPiv] = 1;
aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
// ...and then rearrange elements in the
// pivot information arrays
for (j=0; j<nLPivs; j++) {
aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
}
aLPivLows[0] = nLLVAfterLastPiv;
aLPivIdxs[0] = nLLVIdxAfterLastPiv;
nLPivs++;
// -- Test whether to add piv given last piv is high
// AND we have lower highs
}
// -- Here, the last piv is a high piv, and we have
// higher-highs. The most likely addition is a
// Low piv that is a retracement.
} else {
if (nLLVAfterLastPiv > aLPivLows[0] AND
(nLLVIdxAfterLastPiv - lastHPIdx - 1) >= 1
AND nLLVIdxAfterLastPiv != curBar ) {
// -- OK, we'll add this as a pivot.
// Mark it for plotting...
aLPivs[nLLVIdxAfterLastPiv] = 1;
aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
// ...and then rearrange elements in the
// pivot information arrays
for (j=0; j<nLPivs; j++) {
aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
}
aLPivLows[0] = nLLVAfterLastPiv;
aLPivIdxs[0] = nLLVIdxAfterLastPiv;
nLPivs++;
// -- Test whether to add piv given last piv is high
// AND we have lower highs
}
// -- The last piv is a high and we have higher highs
// OR lower highs
}
/* ****************************************************************
Still finding missed pivot(s). Here, the last piv is a low piv.
**************************************************************** */
} else {
// -- First case, lower highs
if (aHPivHighs[0] < aHPivHighs[1]) {
if (nHHVAfterLastPiv < aHPivHighs[0] AND
(nHHVIdxAfterLastPiv - lastLPIdx - 1) >= 1
AND nHHVIdxAfterLastPiv != curBar ) {
// -- OK, we'll add this as a pivot.
// Mark that for plotting
aHPivs[nHHVIdxAfterLastPiv] = 1;
aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
// ...and then rearrange elements in the
// pivot information arrays
for (j=0; j<nHPivs; j++) {
aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
}
aHPivHighs[0] = nHHVAfterLastPiv;
aHPivIdxs[0] = nHHVIdxAfterLastPiv;
nHPivs++;
// -- Test whether to add piv given last piv is high
// AND we have lower highs
}
// -- Second case when last piv is a low piv, higher highs
// Most likely addition is high piv that is a retracement.
// Considering adding a high piv as long as it is higher
} else {
// -- Where I have higher highs,
if (nHHVAfterLastPiv > aHPivHighs[0] AND
(nHHVIdxAfterLastPiv - lastLPIdx - 1) >= 1
AND nHHVIdxAfterLastPiv != curBar ) {
// -- OK, we'll add this as a pivot.
// Mark it for plotting...
aHPivs[nHHVIdxAfterLastPiv] = 1;
aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
// ...and then rearrange elements in the
// pivot information arrays
for (j=0; j<nHPivs; j++) {
aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
}
aHPivHighs[0] = nHHVAfterLastPiv;
aHPivIdxs[0] = nHHVIdxAfterLastPiv;
nHPivs++;
// -- Test whether to add piv given last piv is high
// AND we have lower highs
}
}
}
// -- If there are at least two of each
}
/* ****************************************
// -- Done with finding pivots
***************************************** */
if (bDraw) {
// -- OK, let's plot the pivots using arrows
PlotShapes( IIf(aHPivs==1, shapeDownArrow, shapeNone), colorRed, layer = 0, yposition = High, offset = -10);
//PlotShapes( IIf(aHPivs==1, shapeSmallSquare, shapeNone), colorBlack, layer = 0, yposition = High, offset = 12);
PlotShapes( IIf(aAddedHPivs==1, shapeDownArrow, shapeNone), colorRed,layer = 0, yposition = High, offset = -10);
//PlotShapes( IIf(aAddedHPivs==1, shapeSmallSquare, shapeNone), colorBlack, layer = 0, yposition = High, offset = 12);
//PlotShapes( IIf(aLPivs==1, shapeSmallSquare, shapeNone), colorBrightGreen, layer = 0, yposition = Low, offset = -9);
//PlotShapes( IIf(aLPivs==1, shapeSmallSquare, shapeNone), colorBlack, layer = 0, yposition = Low, offset = -12);
//PlotShapes( IIf(aAddedLPivs==1, shapeDownArrow, shapeNone), colorGold, layer = 0, yposition = Low, offset = -15);
//PlotShapes( IIf(aAddedLPivs==1, shapeSmallSquare, shapeNone), colorBlack, layer = 0, yposition = Low, offset = -13);
}
_SECTION_END();
///////////////////////////////////////////////////////////////////////
// Define Procedures/Functions
///////////////////////////////////////////////////////////////////////
procedure RemoveEntry(RemSym)
{
// Remove entry from IDList
NewIDList = "";
for( i = 0; ( sym = StrExtract( IDList, i ) ) != "<END>"; i++ )
{
if (sym != RemSym) {NewIDList = NewIDList + sym + ",";}
}
IDList = NewIDList+"<END>,";
fh = fopen( IDListFile, "w");
if( fh )
{
fputs( IDList , fh );
fclose( fh );
}
}
procedure AddEntry(AddSym)
{
// Add entry to IDList
IDList = AddSym + "," + IDList;
printf(IDList);
fh = fopen( IDListFile, "w");
if( fh )
{
fputs( IDList , fh );
fclose( fh );
}
}
procedure DoCalculation(Sym)
{
// All variables should be global
// printf("Calculating: "+Sym+"\n");
Turnover = (C*V); //For Display
// Manual Flip (If Sell Selected before buy)
// Mabie should also flip SellAt open/close.
if (SellBar < BuyBar)
{
BuyBar1 = BuyBar;BuyBar=SellBar;SellBar=BuyBar1;
BuyAt1 = BuyAt;BuyAt=SellAt;SellAt=BuyAt1;
}
// Calc Holding Stats
Totalbuyprice=TotalShare*BuyAt;
//CommisionX1=(Totalbuyprice*CommisionX1)/100;
FinalBuyValue=Totalbuyprice+CommisionX1;
// Calc Holding Stats
Avail = Totalbuyprice-CommisionX1;
Qty = (int(Avail/BuyAt))+HoldingsAdj;
BuyValue = Qty*BuyAt;
LeftoverCash = (Totalbuyprice-BuyValue)-CommisionX1;
MarketValue = Qty*SellAt;
RawCashGain = ((MarketValue)-(BuyValue))*((TradeType*-2)+1); //LongShortFlip
CashReturned = RawCashGain-(CommisionX1*2);
ReturnedTotalbuyprice = Totalbuyprice+CashReturned;
TotalbuypriceGain = (CashReturned/Totalbuyprice)*100; // Total Percent Gained
Trail_Ref = BC - SellBar;
Range_Ref = SellBar - BuyBar+1;
PeakValue = LastValue(Ref(HHV(H,Range_Ref),-Trail_Ref));
Peak_Ref = LastValue(Ref(HHVBars(H,Range_Ref),-Trail_Ref));
TrailBarStart = SellBar-Peak_Ref;
TrailStopValue = PeakValue - (PeakValue * (TrailStop/100));
TrailPercent = 100-((Close[SellBar]/PeakValue)*100);
// Calc Even Stop
EvenStopValue = (Qty*BuyAt) + (CommisionX1*2);
EvenStopPS = EvenStopValue/Qty;
EvenStopPC = ((EvenStopPS/Buyat)*100)-100;
// Calc Profit Stop
ProfitStopCalc = FinalBuyValue*(ProfitStop/100);
ProfitStopValue = FinalBuyValue+ ProfitStopCalc + (CommisionX1*2);
ProfitStopPS = ProfitStopValue/Qty;
PSRequiredGain = ((ProfitStopPS/BuyAt)*100)-100;
// Calc Loss Stop
MaxLossCalc = Totalbuyprice*(StopLoss/100);
MaxLossValue = Totalbuyprice- MaxLossCalc + (CommisionX1*2);
MaxLossPS = MaxLossValue/Qty;
}
procedure DisplayPlots(Sym,symid)
{
// Plot Vertical Buy Bar. (Blue)
VLine = IIf(BuyBar==BNUM,1,0);
//Plot (VLine ,"BuyBar", colorGrey40, styleHistogram | styleOwnScale,0,1);
// Plot Vertical Sell Bar. (Blue)
// VLine = IIf(SellBar==BNUM,1,0);
// Plot (VLine ,"BuyBar", colorBlue, styleHistogram | styleOwnScale,0,1);
//Plot MultiTrade Number
PlotText(symid,Buybar-1,ProfitStopPS,colorRed,colorWhite);
// Plot Horizontal Buy Bar. (Yellow)
x0 = Buybar ; y0 = BuyAt;
x1 = SellBar ; y1 = y0;
Hline = LineArray(x0,y0,x1,y1,0);
//Plot(HLine ,"BuyPrice",colorTeal ,ParamStyle("BuyStyle",styleLine|styleDashed,maskAll));
// Plot Trade Trend (BuyBar to SellBar/SellAT - Blue Dashed Line)
x0 = Buybar ; y0 = BuyAt;
x1 = Sellbar ; y1 = SellAt;
// y1 = C[Sellbar];
Hline = LineArray(x0,y0,x1,y1,0);
//Plot(HLine ,"TradeTrend",colorOrange,styleLine|styleDashed);
// Plot Long/Short Trail Stop Trend
x0 = TrailBarStart; y0=PeakValue;
x1 = SellBar; y1 = C[SellBar];
Line = IIf((X1 > X0),LineArray(x0,y0,x1,y1,0),LineArray(x1,y1,x0,y0,0) ); //Reverse
//Plot(Line,"TrailStop",colorViolet,styleLine|styleDots);
// Plot TrailStop Horizontal (ColorViolet)
x0 = Buybar ; y0 = TrailStopValue;
x1 = SellBar ; y1=y0;
Hline = LineArray(x0,y0,x1,y1,0);
Plot(HLine ,"TrailStop",ParamColor( "TrailStopColor", colorSeaGreen ),ParamStyle("TrailStopStyle",styleDashed|styleThick,maskAll));;
// Plot BreakEven Horizontal (ColorGreen)
x0 = Buybar ; y0 = EvenStopPS;
x1 = SellBar ; y1=y0;
Hline = LineArray(x0,y0,x1,y1,0);
Plot(HLine ,"EvenStop",ParamColor( "EvenStopColor", colorGrey50 ),ParamStyle("EvenStopStyle",styleLine|styleDashed|styleStaircase|styleThick|StyleHidden,maskAll));
// Plot ProfitStop Horizontal (ColorWhite)
x0 = Buybar ; y0 = ProfitStopPS ;
x1 = SellBar ; y1=y0;
Hline = LineArray(x0,y0,x1,y1,0);
Plot(HLine ,"ProfitStop",ParamColor( "ProfitStopColor", colorWhite ),ParamStyle("ProfitStopStyle",styleLine|styleStaircase|styleThick|StyleHidden,maskAll));
// Plot LossStop Horizontal (ColorRed)
x0 = Buybar ; y0 = MaxLossPS;
x1 = SellBar ; y1=y0;
Hline = LineArray(x0,y0,x1,y1,0);
Plot(HLine ,"StopLoss",ParamColor( "StopLossColor", colorRed ),ParamStyle("StopLossStyle",styleLine|styleStaircase|styleThick,maskAll));
}// End DisplayPlots
WorkingDays = SellBar - BuyBar+1;//(SellBar-BuyBar);
Maturestock = WorkingDays>=4;
Immaturestock = WorkingDays<4;
Totalbuyprice=TotalShare*BuyAt;
//CommisionX1=(Totalbuyprice*CommisionX1)/100;
FinalBuyValue=Totalbuyprice+CommisionX1;
procedure CreateTitleDetail(Sym)
{
// Create Title Detail
ssd = StrFormat("%.0f",DNUM[BuyBar]);
ssD = StrRight(ssD,6);
ssD = StrRight(ssD,2)+"-"+StrLeft(StrRight(ssD,4),2)+"-20"+StrLeft(ssD,2);
_N(BuyDate = ssD );
//_N(BuyDate = StrLeft(ssD,10));
//_N(BuyDate = StrFormat("%.0f",DNUM[BuyBar]));
_N(BuyTime = StrFormat("%.0f",TNUM[BuyBar]));
_N(SellDate = StrFormat("%.0f",DNUM[SellBar]));_N(SellTime = StrFormat("%.0f",TNUM[SellBar]));
_N(Title_1 = ""+
"\\c11 BuyDate: \\c11"+ BuyDate +//"/" + BuyTime +
//"\n\\c29 SellBar: \\c23"+ SellBar+"\\c29 SellDT: \\c23"+ SellDate + "/" + SellTime +
//"\n\\c38 Commision \\c38"+CommisionX1+
"\n\\c34 Entry Price: \\c34"+BuyAt+
//"\n\\c38 SellAt \\c01"+SellAt+
"\n\\c33 Share Quantity: \\c33"+TotalShare+
"\n\\c36 TotalBuyPrice: \\c36"+Totalbuyprice+
"\n"+EncodeColor(colorRose)+"-------------------------"
+
//"\n\\c21 BuyValue with Commission: \\c01: "+FinalBuyValue+
//"\n\\c21 LeftoverCash \\c01: "+LeftoverCash+
"\n\\c25 Current MarketValue \\c25: "+MarketValue/100+
"\n\\c54 Profit Gain \\c54: "+RawCashGain+
//"\n\\c21 CashReturned \\c01: "+ CashReturned +
//"\n\\c21 ReturnedTotalbuyprice \\c01: "+ReturnedTotalbuyprice+
"\n\\c48 Profit Percentage \\c48: "+TotalbuypriceGain+"%"+
"\n"+EncodeColor(colorRose)+"-------------------------"
+
//"\n\\c21 PSRequiredGain \\c01: "+PSRequiredGain+"%"+
//"\n\\c29 EvenStop : " + Prec(EvenStopPC,4) + "%, " + EvenStopPS +
"\n\\c44 ProfitTaking: " + ProfitStop + "%, " + ProfitStopPS +
"\n\\c07 StopLoss : " + StopLoss + "%, " + MaxLossPS +
"\n\\c51 TrailStop: \\c51" + TrailStop + "%, " + TrailStopValue +
//"\n\\c08 Working Days " +"\\c02@ \\c07" + WorkingDays+WriteIf(Maturestock," \\c08[Mature]"," ")+WriteIf(Immaturestock,"\\c04[Immature]"," ")+
"\n"+EncodeColor(colorRose)+"-------------------------"
+
//"\n\\c29 TrailVariance: \\c01" +TrailPercent + "% "+
"");
}// End CreateTitle
Totalbuyprice=TotalShare*BuyAt;
CommisionX1=(Totalbuyprice*CommisionX1)/100;
FinalBuyValue=Totalbuyprice+CommisionX1;
procedure LoadID(FileName)
{// Load ID
printf("loading: '"+FileName+"'\n");
fh = fopen( FileName, "r");
if( fh )
{// File open for read
TradeType = StrToNum(fgets( fh ));
TotalShare= StrToNum(fgets( fh ));
//StopLoss=StrToNum(fgets( fh ));
TimeFrame = StrToNum(fgets( fh ));
DBUY = StrToNum(fgets( fh ));
TBUY = StrToNum(fgets( fh ));
DSELL = StrToNum(fgets( fh ));
TSELL = StrToNum(fgets( fh ));
BuyAt = StrToNum(fgets( fh ));
SellAt = StrToNum(fgets( fh ));
HoldingsAdj = StrToNum(fgets( fh ));
ProfitStop = StrToNum(fgets( fh ));
StopLoss = StrToNum(fgets( fh ));
TrailStop = StrToNum(fgets( fh ));
Totalbuyprice = StrToNum(fgets( fh ));
CommisionX1= StrToNum(fgets( fh ));
AlertByte = StrToNum(fgets( fh ));
fclose( fh );
TitleS="ReadFile";
}// End file open for read
else
{// File not found
printf("File Not Found\n");
TitleS="Error";
}// End file not found
}// End Load ID
procedure SaveID(FileName)
{// Write ID
printf("saving: '"+FileName+"'\n");
fh = fopen( FileName, "w");
if( fh )
{// File open for write
fputs( StrFormat("%.00f\n",TradeType ), fh );
//fputs( StrFormat("%.00f\n",StopLoss ), fh );
fputs( StrFormat("%.00f\n",TotalShare), fh );
fputs( StrFormat("%.00f\n",TimeFrame ), fh );
fputs( StrFormat("%.00f\n",DBUY ), fh );
fputs( StrFormat("%.00f\n",TBUY ), fh );
fputs( StrFormat("%.00f\n",DSELL ), fh );
fputs( StrFormat("%.00f\n",TSELL ), fh );
fputs( StrFormat("%.02f\n",BuyAt ), fh );
fputs( StrFormat("%.02f\n",SellAt ), fh );
fputs( StrFormat("%.02f\n",HoldingsAdj ), fh );
fputs( StrFormat("%.02f\n",ProfitStop ), fh );
fputs( StrFormat("%.02f\n",StopLoss ), fh );
fputs( StrFormat("%.02f\n",TrailStop ), fh );
fputs( StrFormat("%.02f\n",Totalbuyprice ), fh );
fputs( StrFormat("%.02f\n",CommisionX1 ), fh );
fputs( StrFormat("%.00f\n",AlertByte ), fh );
fclose( fh );
TitleS = "SaveFile";
}// End File open for write
}// End WriteID
///////////////////////////////////////////////////////////////////////
// End Define Procedures/Functions
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// Start core section.
///////////////////////////////////////////////////////////////////////
{
if (OpenTrade == 1)
{// Open trade.
AlertIf( 1, "", "Open trade", 0,3 );
IDName = Name()+"-"+MultiTrade;
TrailName = DataPath + IDName;
LoadID(TrailName);
SellAt=0;DSELL=0;TSELL=0;
SaveID(TrailName);
}// End Open trade
if (CloseTrade == 1)
{// Close trade.
AlertIf( 1, "", "Close trade", 0,3 );
IDName = Name()+"-"+MultiTrade;
TrailName = DataPath + IDName;
LoadID(TrailName);
DSELL = DNUM[SelectedBar];TSELL = TNUM[SelectedBar];
SellAt=C[SelectedBar];
if (SellAtP != 0) {SellAt=SellAtP;}
SaveID(TrailName);
}// End Close trade
if (RemoveTrade == 1)
{// Remove Entry
AlertIf( 1, "", "Remove trade", 0,3 );
IDName = Name()+"-"+MultiTrade;
RemoveEntry(IDName);
}// End Remove Entry
if (CreateTrade == 1)
{// Write Data
AlertIf( 1, "", "Write trade", 0,3 );
// Set name & add to master index
IDName = Name()+"-"+MultiTrade;
RemoveEntry(IDName);
AddEntry(IDName);
TrailName = DataPath + IDName;
// Write data to file
DBUY = DNUM[BuyBar]; TBUY = TNUM[BuyBar];
DSELL = 0; TSELL = 0; SellAT = 0;
TotalEquity = 0;
SaveID(TrailName);
}// End Write data
// Calc & Display
IDName = Name()+"-"+MultiTrade;
printf("Current: "+IDName+"\n\n");
// Create Title Tally Header.
Title_2 = "-------------------------\n";//"\\c09 SYMBOLS- GAIN\n\n";
if (DisplayPlot == 0)
{// DisplayPlot
// Plot Price & Volume.
PlotForeign( GetBaseIndex(), GetBaseIndex(), colorAqua, styleLine | styleOwnScale);
//Plot( Volume, _DEFAULT_NAME(), colorBlueGrey , styleHistogram | styleOwnScale | styleThick );
if (StrFind(IDList,Name()) == 0)
{// Symbol not found in IDList, use selected.
TitleS="NoFile";
DoCalculation(Name());
DisplayPlots(Name(),"");
CreateTitleDetail(Name());
}// End Symbol not found
else
{// Symbol found in IDList.
if (StrFind(IDList,IDName) == 0)
{// Exact symbol not found in IDList, use selected.
TitleS="NoFile";
DoCalculation(Name());
DisplayPlots(Name(),"");
CreateTitleDetail(Name());
}// End Exact symbol not found
}// End Symbol found
}// End DisplayPlot
flagX = 0;
for( i = 0; ( sym = StrExtract( IDList, i ) ) != "<END>"; i++ )
{// Loop
TrailName = DataPath + sym;
symleft = StrLeft(sym, StrFind(sym,"-")-1); CurrentSym = Name();
symid = StrRight(sym, StrLen(sym)-StrFind(sym,"-"));
// printf("SymLeft: "+symleft+" Current: "+CurrentSym+"\n\n");
// Set Ticker/Trade Environment.
SetForeign(symleft);
// Load & Do Calculation
LoadID(TrailName);
TimeFrameSet(TimeFrame); // after load
//BuyBar = DBUY;
// Calc Buy & Sell Bar
// BuyBar = LastValue(DBUY)+LastValue(Cum((DBUY==DBUY) AND (DBUY<DBUY)));
//BuyBar = LastValue(DBUY,True);
BuyBar = LastValue(Cum(DNUM<DBUY))+LastValue(Cum((DNUM==DBUY) AND (TNUM<TBUY)));
SellBar = LastValue(Cum(DNUM<DSELL))+LastValue(Cum((DNUM==DSELL) AND (TNUM<TSELL)));
XBar = SellBar ;
// Overide Sell
//if ( (SelectedBar != BC) AND (sym == IDName ) AND (TitleS != "Error"))
{SellBar = SelectedBar; SellAt = Close[SellBar];Overide=" @ "+SellBar+" $"+SellAt;}
if (SellBar == 0) {SellBar=BC; SellAt = Close[SellBar];}
// Use loaded Sell Price
if (sym == IDName)
{// Exact match, Overide Sell Price.
if (SellAtP != 0) {SellAt = SellAtP;}
}// End Exact match
// Do the Trade Calcs
DoCalculation(sym); //Doesn't actualy use passed symbol.
// Determine Stops from LastBar/SelectedBar LongMode
ProfitStopFlag = IIf( C[SellBar] >= ProfitStopPS ,True,False);
EvenStopFlag = IIf( C[SellBar] >= EvenStopPS,True,False);
StopLossFlag = IIf( C[SellBar] <= MaxLossPS,True,False);
TrailStopFlag = IIf(TrailPercent >= TrailStop,True,False);
// Generate Alerts Strings for Display
PSD = WriteIf(ProfitStopFlag,"\\c15# ","\\c01. ");
ESD = WriteIf(EvenStopFlag,"\\c15# ","\\c01. ");
LSD = WriteIf(StopLossFlag,"\\c15# ","\\c01. ");
TSD = WriteIf(TrailStopFlag,"\\c15# ","\\c01. ");
WorkingDays = SellBar - BuyBar+1;
NDays = XBar - BuyBar+1;
BeforeEntry = DBUY > DNUM ;
WorkingDays = IIf(BeforeEntry,-1 * (WorkingDays -1),WorkingDays );
Maturestock = WorkingDays>=4;
BuyingDay = WorkingDays==1;
Immaturestock = WorkingDays<4 AND DBUY<=DNUM AND WorkingDays!=1;
MatureString ="\\c08 [Days" +"\\c02@\\c07" + WorkingDays+"] "+WriteIf(Maturestock," \\c08[Mature]","")+WriteIf(Immaturestock,"\\c04[Immature]","")+WriteIf(BuyingDay ,"\\c52[BuyingDay]","")+WriteIf(BeforeEntry ,"\\c04[BeforeEntry]","");
//MatureString =StrFormat(" %.0f ",DBUY)+ StrFormat(" %.0f ",SellBar )+"\\c08 [Days" +"\\c02@\\c07" + WorkingDays+"] "+WriteIf(Maturestock," \\c08[Mature]"," ")+WriteIf(Immaturestock,"\\c04[Immature]"," ")+WriteIf(BeforeEntry ,"\\c04[BeforeEntry]"," ");
if(flagX ==0){
nid = sym ;
}
if (sym == IDName)
{
flagX = 1;
nid = IDName;
en = BuyAt;
wd = StrToNum(StrFormat("%.0f",NDays ));
awd = StrToNum(StrFormat("%.0f",WorkingDays));
}
sss = StrFormat("%.0f",DBUY );
sss = StrRight(sss,6);
sss = StrRight(sss,2)+"-"+StrLeft(StrRight(sss,4),2)+"-20"+StrLeft(sss,2)+"] " + MatureString ;
// Create Title Tally Strings
ListAlerts = PSD + ESD + LSD + TSD; Tally = Tally + CashReturned;
Title_2 = Title_2 + " \\c02" + StrLeft(sym,StrLen(sym)-2) +
": [Buy " + sss + ""+
"\n\\c41 Entry @ "+BuyAt+
"\\c10 -- \\c33 NOS: \\c33"+TotalShare+
"\\c10 --\\c36 Value: \\c36"+Totalbuyprice+
"\n\\c44 Profit $" + StrFormat("%08.2f",CashReturned) + " \\c51 Percent: " + StrFormat("%+06.2f",TotalbuypriceGain) + "%\n"+
//"\\c44 ProfitTaking: " + ProfitStop + "%, " + ProfitStopPS + " \\c07 StopLoss : " + StopLoss + "%, " + MaxLossPS + " \\c51 TrailStop: \\c51" + TrailStop + "%, " + TrailStopValue +
//"\n"+
EncodeColor(colorRose)+"-------------------------\n";
if (sym == IDName)
{// Exact match, Create title.
CreateTitleDetail(sym);
}// End Exact match
// Select Plot Display
if (DisplayPlot == 1) {Plot(C,"Close:"+symleft,i+16,styleLine | styleOwnScale);}
if ((DisplayPlot == 0) AND (symleft == CurrentSym)) {DisplayPlots(sym,symid);}
// Cleanup
TimeFrameRestore();
RestorePriceArrays();
}// End loop
// End of Calc & Display
// Dynamic Title
TSpace = "";
for( i = 0; i<TitleSlide ; i++ ) {TSpace = TSpace + "\n";}
HighLowPercent_2 = (H - L)*100/H;
MAHighClosePercent = MA((H - C)*100/H,64);
Title_Header =Name()+ " "+ WriteVal( SelectedValue( DateTime() ), formatDateTime) + " Open - "+O + " High - "+ H + " Low - "+ L +" Close - "+C + StrFormat(" (%.1f%%) ", SelectedValue( ROC( C, 1 ) )) +
"\nVolume - " +V + " "+StrFormat("(%.1f%%) ", SelectedValue(ROC(V,1))) +" Average Volume(12) - " + MA(V,12) +
"\nHC : "+StrFormat("(%.1f%%) ", HighClosePercent ) +" AHC(64): "+StrFormat("(%.1f%%) ", MAHighClosePercent )+
" AHL(25): "+StrFormat("(%.1f%%) ", HighLowPercent )+ " H-L: "+StrFormat("(%.1f%%) ", HighLowPercent_2 )+ "\\c36";
Title_NetProfitLoss = "-------------------------\n"+"\\c45 Net Profit/Loss : " + Tally + " " +EncodeColor(colorRose)+"\n";
Title_1 = "";
if (TitleStyleT == "Detail")
{Title = Title_Header + Title_1;}
if (TitleStyleT == "Tally")
{Title = Title_Header + Title_2 + "\\c09 Tally:$" + Tally + " " ;}
if (TitleStyleT == "Detail/Tally")
{Title = Title_Header + Title_1+ "\n" + Title_NetProfitLoss + Title_2 ;}
if (TitleStyleT == "None")
{Title = Title_Header ;}
// End Dynamic Title
}
if(flagX ==0){
nid = sym ;
}
///////////////////////////////////////////////////////////////////////
// End Core Section.
///////////////////////////////////////////////////////////////////////
_SECTION_END();
nid = StrLeft(nid ,StrLen(nid )-2);
xid = Name();
if(nid == xid){
if(awd <0){
wd = wd+awd;
}
wd = wd*(-1);
for( i = 0; i<BarCount; i++ ){
local_C = C[wd];
}
for( i = wd; i<BarCount; i++ ){
local_C = C;
}
}
else{
nid = "";
}
z = BarIndex();
tz = StrFormat("%.0f",z);
zt = StrToNum(tz);
/*
MyATR=ATR(14);//Enter ATR Average or use the 14 Day Moving Average of ATR
MidRange=(H+L)/2;//Figure Used In Title for Middle of Trading Range
if(nid == xid){
Plot (local_C- (MyATR*2),"",IIf(z<=wd-2,colorBlack,colorWhite), styleLine);
Plot (local_C- (MyATR*1.5),"",IIf(z<=wd-2,colorBlack,colorWhite), styleLine);
Plot (local_C- (MyATR*3),"",IIf(z<=wd-2,colorBlack,colorWhite),styleLine);
}
*/
/*
_SECTION_BEGIN("Stop loss7");
lookbackPeriod7 = Param("Lookback period7", 20, 7, 30);
stoplossPercentage7 = 7;//Param("Stoploss Percentage7", 7, 7, 10);
if(nid == xid){
Plot(HHV(local_C,lookbackPeriod7) - HHV(local_C,lookbackPeriod7) * (stoplossPercentage7 / 100), "Trailing stoploss7", IIf(z<=wd-2,colorBlack,colorRed), styleDashed|styleThick,0,0,0);
}
_SECTION_END();
_SECTION_BEGIN("Stop loss5");
lookbackPeriod5 = Param("Lookback period5", 20, 5, 30);
stoplossPercentage5 = 5;//Param("Stoploss Percentage5", 5, 2, 10);
if(nid ==xid){
Plot(HHV(local_C,lookbackPeriod5) - HHV(local_C,lookbackPeriod5) * (stoplossPercentage5 / 100), "Trailing stoploss5", IIf(z<=wd-2,colorBlack,colorYellow), styleDashed|styleThick,0,0,0);
}
_SECTION_END();
*/
_SECTION_BEGIN("Stoploss Line");
if(nid == xid){
mf = Param("ATR multiplier",3,1,5,0.25);
ap=Param("ATR Period",10,5,30,1);
Lb=20;//Param("Lookback Period",20,10,40,1);
ps=1;//ParamToggle("Use last low pivot","Use,Dont",1);
//p1=ParamToggle("plot type","line,Dots",1);
t1=HHV(local_C,Lb);
t2=(mf*ATR(ap));
t3=Trough(local_C,2,1);
t4=t1-t2;
t5=Min(t4,t3);
if(ps)
{
t6 = t1-t2;
}
else
{
t6=t5;
}
initial=t6;
stop[ 0 ] = local_C[ 0 ];
for( i = 1 ; i < BarCount; i++)
{
if( local_C[ i ] > stop[ i - 1])
{
temp = t6[ i ];
if( temp > stop[ i - 1 ] ) stop[ i ] = temp;
else stop[ i ] = stop[ i - 1 ];
}
else
stop[ i ] = initial[ i ];
}
Plot(stop,"ATR Stop",IIf(z<=wd-2,colorBlack,ParamColor( "Color", colorLightYellow)),IIf(wd<0,styleNoDraw,styleLine|styleDots|styleNoTitle));
}
/////////////////here ATR ends////////////////////////////////////
_SECTION_END();