WriteIf returns single string, was: Loop string for selection of Expiry

Please help me with ticker expiry selection based on datenum.
Sharing the code and exploration result.
Thanks in advance...

_SECTION_BEGIN("Test Daily");
Barcomplete = BarIndex() < LastValue(BarIndex());
SetOption("futuresmode", True);
SetOption("PriceBoundChecking", False);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NewDay		  =  IIf(DateNum()!=Ref(DateNum(),-1),1,0);
NewQStart 	  =  IIf(DateNum()!=Ref(Datenum(),-1),1,0);
StopNewTrade  =  IIf(TimeNum()>143000,1,0);
PeriodEnding  =  IIf(TimeNum()>152400,1,0);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	 if(Name()=="NIFTY" OR Name()=="NIFTY-1" OR Name()=="NIFTY-I.NFO")				{STK_Diff=100;	Asst_Name="NIFTY";}
else if(Name()=="BANKNIFTY" OR Name()=="BANKNIFTY-1" OR Name()=="BANKNIFTY-I.NFO")	{STK_Diff=500;	Asst_Name="BANKNIFTY";}

Expi_Select=WriteIf(DateNum()>=1210101 AND DateNum()<=1210107,"07JAN21",WriteIf(DateNum()>=1210108 AND DateNum()<=1210114,"14JAN21",WriteIf(DateNum()>=1210115 AND DateNum()<=1210121,"21JAN21",
			WriteIf(DateNum()>=1210122 AND DateNum()<=1210128,"28JAN21",WriteIf(DateNum()>=1210129 AND DateNum()<=1210204,"04FEB21",WriteIf(DateNum()>=1210205 AND DateNum()<=1210211,"11FEB21",
			WriteIf(DateNum()>=1210212 AND DateNum()<=1210218,"18FEB21",WriteIf(DateNum()>=1210219 AND DateNum()<=1210225,"25FEB21",WriteIf(DateNum()>=1210226 AND DateNum()<=1210304,"04MAR21",
			WriteIf(DateNum()>=1210305 AND DateNum()<=1210311,"10MAR21",WriteIf(DateNum()>=1210312 AND DateNum()<=1210318,"18MAR21",WriteIf(DateNum()>=1210319 AND DateNum()<=1210325,"25MAR21",
			WriteIf(DateNum()>=1210326 AND DateNum()<=1210401,"01APR21",WriteIf(DateNum()>=1210402 AND DateNum()<=1210408,"08APR21",WriteIf(DateNum()>=1210409 AND DateNum()<=1210415,"15APR21",
			WriteIf(DateNum()>=1210416 AND DateNum()<=1210422,"22APR21",WriteIf(DateNum()>=1210423 AND DateNum()<=1210429,"29APR21",
			"0")))))))))))))))));

Close_1=Null;
for(i=1; i<BarCount; i++)
{
		 if(NewDay[i]==1)	{Close_1[i]=C[i];}
	else 					{Close_1[i]=Close_1[i-1];}
}
Strike=(Round(Round(Close_1)/STK_Diff)*STK_Diff);
Stk_Name=Asst_Name+Expi_Select+Strike+"CE.NFO";
Call1=Foreign(Stk_Name,"C",True);

_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot(Close,"Close",colorBlack,styleCandle);
Title = Title +  "\n" +
EncodeColor(colorGold )+"Call_ATM = " +Stk_Name+" , "	+Call1	+ "\n";

Filter=1;
AddColumn(Close,"Underlying",10.2);
AddTextColumn(Expi_Select,"Expiry",10.0);
AddTextColumn(Stk_Name,"Contract",10.0);
AddColumn(Call1,"Call_Val",10.2);

Screenshot String Issue

You may get more answers if you follow this advice: How to ask a good question

Also check the manual AFL Function Reference - WRITEIF especially comment section that clearly says:

Please note that WriteIf returns just single string representing current SelectedValue of the EXPRESSION

So, you can't output different text on bar by bar basis for single symbol.

The solution is to use AddMultiTextColumn and it was discussed already:

https://forum.amibroker.com/search?q=AddMultiTextColumn

Or AddRow function AFL Function Reference - ADDROW

https://forum.amibroker.com/search?q=AddRow

Thanks for the response Tomasz,

I am already a die heart fan of this software, Using it for almost 3-4 years for all my technical trading...
I accept that the question was not framed properly and coz this was the first time I have started using the forum so hardly knew what to do....

The Problem that I am facing and have been facing for the past 3years is with using the Writeif which your rightly pointed out that it returns "just single string representing current SelectedValue of the EXPRESSION"...
Is there any alternative to this so that I can manipulate the sting based on the datetime, as you can see in the code what I am trying to do is based on the datetime I want to choose the weekly expiry Ticker. Since the Writeif only returns a single value; for the results i have to explore for each day separately otherwise the code will look for the Last selected expiry and fetch the data for the entire period which did not even exist.
If you see in the attached screen shot the prices the 2021-01-29 to 2021-02-04 are empty , this is cox the 18MAR21 contract was not launched ... If the WriteIf would be returning bar wise values then the Expiry there should have been "04FEB21" then the prices would have also been fetched...

Please Please help me with some solution, I have been struggling with this for Past 1.5Years... For every result I practically run this exploration for every date and i have 10years of data...
I Will also share the result based on weekly exploration which I have to generate by running each expiry separately...

Thanks again for your response and a fantastic product.

Ashish Shroff.
Screenshot String Issue 5

Screenshot String Issue 3

Screenshot String Issue 4

@ashishshroff I'm not sure if I understand exactly what you want but perhaps something like this?
image

@Tomasz told you to use AddMultiTextColumn which I don't see anywhere in your code? Might that be the solution, for example,

ExpiSelect=IIf(DateNum()>=1210101 AND DateNum()<=1210107, 0,
			IIf(DateNum()>=1210108 AND DateNum()<=1210114, 1,
			IIf(DateNum()>=1210115 AND DateNum()<=1210121, 2,
			3))); // etc etc
			
TextList = "07 JAN 2021\n14 JAN 2021\n21 JAN 2021"; 
TextSelector = ExpiSelect; // ExpiSelect will have a value of 0 or 1 or 2
		
Filter=1;
AddMultiTextColumn( TextSelector, TextList, "Expiry" );

If that helps it opens up the possibilities of creating more aesthetically pleasing explorations too.
image

3 Likes

Thanks For the Response...
Will Try this and Check weather I am able the use it in the Foreign also...
Maybe I am not able to explain my problem properly...
It's not just the Display value... For which i have understood the Solution to add Row....
Will this also work for foreign???
In the Following part of the Code :::

Expi_Select=
WriteIf(DateNum()>=1210101 AND DateNum()<=1210107,"07JAN21",
WriteIf(DateNum()>=1210108 AND DateNum()<=1210114,"14JAN21",
WriteIf(DateNum()>=1210115 AND DateNum()<=1210121,"21JAN21",
WriteIf(DateNum()>=1210122 AND DateNum()<=1210128,"28JAN21",
WriteIf(DateNum()>=1210129 AND DateNum()<=1210204,"04FEB21",
WriteIf(DateNum()>=1210205 AND DateNum()<=1210211,"11FEB21",
WriteIf(DateNum()>=1210212 AND DateNum()<=1210218,"18FEB21",
WriteIf(DateNum()>=1210219 AND DateNum()<=1210225,"25FEB21",
WriteIf(DateNum()>=1210226 AND DateNum()<=1210304,"04MAR21",
WriteIf(DateNum()>=1210305 AND DateNum()<=1210311,"10MAR21",
WriteIf(DateNum()>=1210312 AND DateNum()<=1210318,"18MAR21",
WriteIf(DateNum()>=1210319 AND DateNum()<=1210325,"25MAR21",
WriteIf(DateNum()>=1210326 AND DateNum()<=1210401,"01APR21",
WriteIf(DateNum()>=1210402 AND DateNum()<=1210408,"08APR21",
WriteIf(DateNum()>=1210409 AND DateNum()<=1210415,"15APR21",
WriteIf(DateNum()>=1210416 AND DateNum()<=1210422,"22APR21",
WriteIf(DateNum()>=1210423 AND DateNum()<=1210429,"29APR21","")))))))))))))))));
STK_Diff=100;
Asst_Name="NIFTY";
Strike=(Round(Round(Close_1)/STK_Diff)*STK_Diff);
Stk_Name=Asst_Name+Expi_Select+Strike+"CE.NFO";
Call1=Foreign(Stk_Name,"C",True);

If I Explore the Code From 01JAN2021 to 18MAR2021... It will find the Foreign for NIFTY+18MAR21 as that is what is being returned by the Expiry select.
But ON 01JAN21 the foreign should get data for NIFTY+07JAN21 ...
How can I do that... is there a way?

Thanks you so much for the help.... Understood this Part to add Expiry based on the Date through AddMultiTextColumn...
Also can you suggest me a way to use it in the Foreign so that if I explore in the longer term I am able to call the foreign with different Expiry based on the DateNum...
I have been struggling with this for a long time...

Apologies for simple questions...
Also How did you add different colors to the different expiries?

AFL Function Reference - ADDMULTITEXTCOLUMN (amibroker.com)

WriteIf is for string.
You have to use IIf() function not WriteIf(). You are dealing with arrays.
Create a list of Foreign() variables. Then IIf(date_range1, Frg1, IIf(date_range2, Frg2, ....)....

Here is solution:
NOTE: if you use intraday data then set time argument of lines seven and eight to values other than NULL (also if you use >= daily interval) else if it is EOD data then set to NULL.

/// @link https://forum.amibroker.com/t/writeif-returns-single-string-was-loop-string-for-selection-of-expiry/24649/12
dt_list = "07JAN21,14JAN21,21JAN21,28JAN21,04FEB21,11FEB21,18FEB21,25FEB21,"+
		"04MAR21,10MAR21,18MAR21,25MAR21,01APR21,08APR21,15APR21,22APR21,29APR21";
str_count = StrCount(dt_list, ",")+1;
//
dt = DateTime();
start_dt0 = DateTimeConvert(2, 1210101, 0);
end_dt0 = DateTimeConvert(2, 1210107, 235959);
//
Expi_Select = 0;
prefix = "NIFTY";
appendix = "CE.NFO";
for ( i = 0; i < str_count; i++ ) {
	amount = i*7;
	start_dt = DateTimeAdd(start_dt0, amount, inDaily);
	end_dt = DateTimeAdd(end_dt0, amount, inDaily);		
	printf("exp: %s, start: %s, end: %s\n", 
	StrExtract(dt_list, i), DateTimeToStr(start_dt), DateTimeToStr(end_dt));
	
	Stk_Name = prefix+StrExtract(dt_list, i)+appendix;	
	date_range = dt >= start_dt AND dt <= end_dt;
	Expi_Select += IIf(date_range, Foreign(Stk_Name, "C"), 0);
}
Expi_Select = IIf(Expi_Select>0, Expi_Select, Null);

Plot( Expi_Select, "Price", colorDefault, styleHistogram );
3 Likes
/// @link https://forum.amibroker.com/t/writeif-returns-single-string-was-loop-string-for-selection-of-expiry/24649/12
	 if(Name()=="NIFTY" OR Name()=="NIFTY-1" OR Name()=="NIFTY-I.NFO")				{STK_Diff=100;	Asset_Name="NIFTY";		}
else if(Name()=="BANKNIFTY" OR Name()=="BANKNIFTY-1" OR Name()=="BANKNIFTY-I.NFO")	{STK_Diff=500;	Asset_Name="BANKNIFTY";	}

dt_list = "09JUN16,16JUN16,23JUN16,30JUN16,07JUL16,14JUL16,21JUL16,28JUL16,04AUG16,11AUG16,18AUG16,25AUG16,01SEP16,08SEP16,15SEP16,22SEP16,29SEP16,06OCT16,13OCT16,20OCT16,27OCT16,03NOV16,10NOV16,17NOV16,"+
  "24NOV16,01DEC16,08DEC16,15DEC16,22DEC16,29DEC16,05JAN17,12JAN17,19JAN17,25JAN16,02FEB17,09FEB17,16FEB17,23FEB17,02MAR17,09MAR17,16MAR17,23MAR17,30MAR17,06APR17,13APR17,20APR17,27APR17,04MAY17,11MAY17,"+
  "18MAY17,25MAY17,01JUN17,08JUN17,15JUN17,22JUN17,29JUN17,06JUL17,13JUL17,20JUL17,27JUL17,03AUG17,10AUG17,17AUG17,24AUG17,31AUG17,07SEP17,14SEP17,21SEP17,28SEP17,05OCT17,12OCT17,18OCT17,26OCT17,02NOV17,"+
  "09NOV17,16NOV17,23NOV17,30NOV17,07DEC17,14DEC17,21DEC17,28DEC17,04JAN18,11JAN18,18JAN18,25JAN18,01FEB18,08FEB18,15FEB18,22FEB18,01MAR18,08MAR18,15MAR18,22MAR18,28MAR18,05APR18,12APR18,19APR18,26APR18,"+
  "03MAY18,10MAY18,17MAY18,24MAY18,31MAY18,07JUN18,14JUN18,21JUN18,28JUN18,05JUL18,12JUL18,19JUL18,26JUL18,02AUG18,09AUG18,16AUG18,23AUG18,30AUG18,06SEP18,12SEP18,19SEP18,27SEP18,04OCT18,11OCT18,17OCT18,"+
  "25OCT18,01NOV18,08NOV18,15NOV18,22NOV18,29NOV18,06DEC18,13DEC18,20DEC18,27DEC18,03JAN19,10JAN19,17JAN19,24JAN19,31JAN19,07FEB19,14FEB19,21FEB19,28FEB19,07MAR19,14MAR19,20MAR19,28MAR19,04APR19,11APR19,"+
  "18APR19,25APR19,02MAY19,09MAY19,16MAY19,23MAY19,30MAY19,06JUN19,13JUN19,20JUN19,27JUN19,04JUL19,11JUL19,18JUL19,25JUL19,01AUG19,08AUG19,14AUG19,22AUG19,29AUG19,05SEP19,12SEP19,19SEP19,26SEP19,03OCT19,"+
  "10OCT19,17OCT19,24OCT19,31OCT19,07NOV19,14NOV19,21NOV19,28NOV19,05DEC19,12DEC19,19DEC19,26DEC19,02JAN20,09JAN20,16JAN20,23JAN20,30JAN20,06FEB20,13FEB20,20FEB20,27FEB20,05MAR20,12MAR20,19MAR20,26MAR20,"+
  "01APR20,09APR20,16APR20,23APR20,30APR20,07MAY20,14MAY20,21MAY20,28MAY20,04JUN20,11JUN20,18JUN20,25JUN20,02JUL20,09JUL20,16JUL20,23JUL20,30JUL20,06AUG20,13AUG20,20AUG20,27AUG20,03SEP20,10SEP20,17SEP20,"+
  "24SEP20,01OCT20,08OCT20,15OCT20,22OCT20,29OCT20,05NOV20,12NOV20,19NOV20,26NOV20,03DEC20,10DEC20,17DEC20,24DEC20,31DEC20,07JAN21,14JAN21,21JAN21,28JAN21,04FEB21,11FEB21,18FEB21,25FEB21,04MAR21,10MAR21,"+
  "18MAR21,25MAR21,01APR21,08APR21,15APR21,22APR21,29APR21,06MAY21,12MAY21,20MAY21,27MAY21,03JUN21,10JUN21,17JUN21,24JUN21,01JUL21,08JUL21,15JUL21,22JUL21,29JUL21,05AUG21,12AUG21,18AUG21,26AUG21,02SEP21,"+
  "09SEP21,16SEP21,23SEP21,30SEP21,07OCT21,14OCT21,21OCT21,28OCT21,03NOV21,11NOV21,18NOV21,25NOV21,02DEC21,09DEC21,16DEC21,23DEC21,30DEC21,06JAN22";
  
List2="02JUN16\n09JUN16\n16JUN16\n23JUN16\n30JUN16\n07JUL16\n14JUL16\n21JUL16\n28JUL16\n04AUG16\n11AUG16\n18AUG16\n25AUG16\n01SEP16\n08SEP16\n15SEP16\n22SEP16\n29SEP16\n06OCT16\n13OCT16\n20OCT16\n27OCT16\n03NOV16\n"+
	  "10NOV16\n17NOV16\n24NOV16\n01DEC16\n08DEC16\n15DEC16\n22DEC16\n29DEC16\n05JAN17\n12JAN17\n19JAN17\n25JAN16\n02FEB17\n09FEB17\n16FEB17\n23FEB17\n02MAR17\n09MAR17\n16MAR17\n23MAR17\n30MAR17\n06APR17\n"+
	  "13APR17\n20APR17\n27APR17\n04MAY17\n11MAY17\n18MAY17\n25MAY17\n01JUN17\n08JUN17\n15JUN17\n22JUN17\n29JUN17\n06JUL17\n13JUL17\n20JUL17\n27JUL17\n03AUG17\n10AUG17\n17AUG17\n24AUG17\n31AUG17\n07SEP17\n"+
	  "14SEP17\n21SEP17\n28SEP17\n05OCT17\n12OCT17\n18OCT17\n26OCT17\n02NOV17\n09NOV17\n16NOV17\n23NOV17\n30NOV17\n07DEC17\n14DEC17\n21DEC17\n28DEC17\n04JAN18\n11JAN18\n18JAN18\n25JAN18\n01FEB18\n08FEB18\n"+
	  "15FEB18\n22FEB18\n01MAR18\n08MAR18\n15MAR18\n22MAR18\n28MAR18\n05APR18\n12APR18\n19APR18\n26APR18\n03MAY18\n10MAY18\n17MAY18\n24MAY18\n31MAY18\n07JUN18\n14JUN18\n21JUN18\n28JUN18\n05JUL18\n12JUL18\n"+
	  "19JUL18\n26JUL18\n02AUG18\n09AUG18\n16AUG18\n23AUG18\n30AUG18\n06SEP18\n12SEP18\n19SEP18\n27SEP18\n04OCT18\n11OCT18\n17OCT18\n25OCT18\n01NOV18\n08NOV18\n15NOV18\n22NOV18\n29NOV18\n06DEC18\n13DEC18\n"+
	  "20DEC18\n27DEC18\n03JAN19\n10JAN19\n17JAN19\n24JAN19\n31JAN19\n07FEB19\n14FEB19\n21FEB19\n28FEB19\n07MAR19\n14MAR19\n20MAR19\n28MAR19\n04APR19\n11APR19\n18APR19\n25APR19\n02MAY19\n09MAY19\n16MAY19\n"+
	  "23MAY19\n30MAY19\n06JUN19\n13JUN19\n20JUN19\n27JUN19\n04JUL19\n11JUL19\n18JUL19\n25JUL19\n01AUG19\n08AUG19\n14AUG19\n22AUG19\n29AUG19\n05SEP19\n12SEP19\n19SEP19\n26SEP19\n03OCT19\n10OCT19\n17OCT19\n"+
	  "24OCT19\n31OCT19\n07NOV19\n14NOV19\n21NOV19\n28NOV19\n05DEC19\n12DEC19\n19DEC19\n26DEC19\n02JAN20\n09JAN20\n16JAN20\n23JAN20\n30JAN20\n06FEB20\n13FEB20\n20FEB20\n27FEB20\n05MAR20\n12MAR20\n19MAR20\n"+
	  "26MAR20\n01APR20\n09APR20\n16APR20\n23APR20\n30APR20\n07MAY20\n14MAY20\n21MAY20\n28MAY20\n04JUN20\n11JUN20\n18JUN20\n25JUN20\n02JUL20\n09JUL20\n16JUL20\n23JUL20\n30JUL20\n06AUG20\n13AUG20\n20AUG20\n"+
	  "27AUG20\n03SEP20\n10SEP20\n17SEP20\n24SEP20\n01OCT20\n08OCT20\n15OCT20\n22OCT20\n29OCT20\n05NOV20\n12NOV20\n19NOV20\n26NOV20\n03DEC20\n10DEC20\n17DEC20\n24DEC20\n31DEC20\n07JAN21\n14JAN21\n21JAN21\n"+
	  "28JAN21\n04FEB21\n11FEB21\n18FEB21\n25FEB21\n04MAR21\n10MAR21\n18MAR21\n25MAR21\n01APR21\n08APR21\n15APR21\n22APR21\n29APR21\n06MAY21\n12MAY21\n20MAY21\n27MAY21\n03JUN21\n10JUN21\n17JUN21\n24JUN21\n"+
	  "01JUL21\n08JUL21\n15JUL21\n22JUL21\n29JUL21\n05AUG21\n12AUG21\n18AUG21\n26AUG21\n02SEP21\n09SEP21\n16SEP21\n23SEP21\n30SEP21\n07OCT21\n14OCT21\n21OCT21\n28OCT21\n03NOV21\n11NOV21\n18NOV21\n25NOV21\n"+
	  "02DEC21\n09DEC21\n16DEC21\n23DEC21\n30DEC21\n06JAN22";

Mul=
IIf(DateNum()>=1160527 AND DateNum()<=1160602,0,IIf(DateNum()>=1160603 AND DateNum()<=1160609,1,IIf(DateNum()>=1160610 AND DateNum()<=1160616,2,IIf(DateNum()>=1160617 AND DateNum()<=1160623,3,
IIf(DateNum()>=1160624 AND DateNum()<=1160630,4,IIf(DateNum()>=1160701 AND DateNum()<=1160707,5,IIf(DateNum()>=1160708 AND DateNum()<=1160714,6,IIf(DateNum()>=1160715 AND DateNum()<=1160721,7,
IIf(DateNum()>=1160722 AND DateNum()<=1160728,8,IIf(DateNum()>=1160729 AND DateNum()<=1160804,9,IIf(DateNum()>=1160805 AND DateNum()<=1160811,10,IIf(DateNum()>=1160812 AND DateNum()<=1160818,11,
IIf(DateNum()>=1160819 AND DateNum()<=1160825,12,IIf(DateNum()>=1160826 AND DateNum()<=1160901,13,IIf(DateNum()>=1160902 AND DateNum()<=1160908,14,IIf(DateNum()>=1160909 AND DateNum()<=1160915,15,
IIf(DateNum()>=1160916 AND DateNum()<=1160922,16,IIf(DateNum()>=1160923 AND DateNum()<=1160929,17,IIf(DateNum()>=1160930 AND DateNum()<=1161006,18,IIf(DateNum()>=1161007 AND DateNum()<=1161013,19,
IIf(DateNum()>=1161014 AND DateNum()<=1161020,20,IIf(DateNum()>=1161021 AND DateNum()<=1161027,21,IIf(DateNum()>=1161028 AND DateNum()<=1161103,22,IIf(DateNum()>=1161104 AND DateNum()<=1161110,23,
IIf(DateNum()>=1161111 AND DateNum()<=1161117,24,IIf(DateNum()>=1161118 AND DateNum()<=1161124,25,IIf(DateNum()>=1161125 AND DateNum()<=1161201,26,IIf(DateNum()>=1161202 AND DateNum()<=1161208,27,
IIf(DateNum()>=1161209 AND DateNum()<=1161215,28,IIf(DateNum()>=1161216 AND DateNum()<=1161222,29,IIf(DateNum()>=1161223 AND DateNum()<=1161229,30,IIf(DateNum()>=1161230 AND DateNum()<=1170105,31,
IIf(DateNum()>=1170106 AND DateNum()<=1170112,32,IIf(DateNum()>=1170113 AND DateNum()<=1170119,33,IIf(DateNum()>=1170120 AND DateNum()<=1170125,34,IIf(DateNum()>=1170127 AND DateNum()<=1170202,35,
IIf(DateNum()>=1170203 AND DateNum()<=1170209,36,IIf(DateNum()>=1170210 AND DateNum()<=1170216,37,IIf(DateNum()>=1170217 AND DateNum()<=1170223,38,IIf(DateNum()>=1170224 AND DateNum()<=1170302,39,
IIf(DateNum()>=1170303 AND DateNum()<=1170309,40,IIf(DateNum()>=1170310 AND DateNum()<=1170316,41,IIf(DateNum()>=1170317 AND DateNum()<=1170323,42,IIf(DateNum()>=1170324 AND DateNum()<=1170330,43,
IIf(DateNum()>=1170331 AND DateNum()<=1170406,44,IIf(DateNum()>=1170407 AND DateNum()<=1170413,45,IIf(DateNum()>=1170414 AND DateNum()<=1170420,46,IIf(DateNum()>=1170421 AND DateNum()<=1170427,47,
IIf(DateNum()>=1170428 AND DateNum()<=1170504,48,IIf(DateNum()>=1170505 AND DateNum()<=1170511,49,IIf(DateNum()>=1170512 AND DateNum()<=1170518,50,IIf(DateNum()>=1170519 AND DateNum()<=1170525,51,
IIf(DateNum()>=1170526 AND DateNum()<=1170601,52,IIf(DateNum()>=1170602 AND DateNum()<=1170608,53,IIf(DateNum()>=1170609 AND DateNum()<=1170615,54,IIf(DateNum()>=1170616 AND DateNum()<=1170622,55,
IIf(DateNum()>=1170623 AND DateNum()<=1170629,56,IIf(DateNum()>=1170630 AND DateNum()<=1170706,57,IIf(DateNum()>=1170707 AND DateNum()<=1170713,58,IIf(DateNum()>=1170714 AND DateNum()<=1170720,59,
IIf(DateNum()>=1170721 AND DateNum()<=1170727,60,IIf(DateNum()>=1170728 AND DateNum()<=1170803,61,IIf(DateNum()>=1170804 AND DateNum()<=1170810,62,IIf(DateNum()>=1170811 AND DateNum()<=1170817,63,
IIf(DateNum()>=1170818 AND DateNum()<=1170824,64,IIf(DateNum()>=1170825 AND DateNum()<=1170831,65,IIf(DateNum()>=1170901 AND DateNum()<=1170907,66,IIf(DateNum()>=1170908 AND DateNum()<=1170914,67,
IIf(DateNum()>=1170915 AND DateNum()<=1170921,68,IIf(DateNum()>=1170922 AND DateNum()<=1170928,69,IIf(DateNum()>=1170929 AND DateNum()<=1171005,70,IIf(DateNum()>=1171006 AND DateNum()<=1171012,71,
IIf(DateNum()>=1171013 AND DateNum()<=1171018,72,IIf(DateNum()>=1171020 AND DateNum()<=1171026,73,IIf(DateNum()>=1171027 AND DateNum()<=1171102,74,IIf(DateNum()>=1171103 AND DateNum()<=1171109,75,
IIf(DateNum()>=1171110 AND DateNum()<=1171116,76,IIf(DateNum()>=1171117 AND DateNum()<=1171123,77,IIf(DateNum()>=1171124 AND DateNum()<=1171130,78,IIf(DateNum()>=1171201 AND DateNum()<=1171207,79,
IIf(DateNum()>=1171208 AND DateNum()<=1171214,80,IIf(DateNum()>=1171215 AND DateNum()<=1171221,81,IIf(DateNum()>=1171222 AND DateNum()<=1171228,82,IIf(DateNum()>=1171229 AND DateNum()<=1180104,83,
IIf(DateNum()>=1180105 AND DateNum()<=1180111,84,IIf(DateNum()>=1180112 AND DateNum()<=1180118,85,IIf(DateNum()>=1180119 AND DateNum()<=1180125,86,IIf(DateNum()>=1180126 AND DateNum()<=1180201,87,
IIf(DateNum()>=1180202 AND DateNum()<=1180208,88,IIf(DateNum()>=1180209 AND DateNum()<=1180215,89,IIf(DateNum()>=1180216 AND DateNum()<=1180222,90,IIf(DateNum()>=1180223 AND DateNum()<=1180301,91,
IIf(DateNum()>=1180302 AND DateNum()<=1180308,92,IIf(DateNum()>=1180309 AND DateNum()<=1180315,93,IIf(DateNum()>=1180316 AND DateNum()<=1180322,94,IIf(DateNum()>=1180323 AND DateNum()<=1180328,95,
IIf(DateNum()>=1180330 AND DateNum()<=1180405,96,IIf(DateNum()>=1180406 AND DateNum()<=1180412,97,IIf(DateNum()>=1180413 AND DateNum()<=1180419,98,IIf(DateNum()>=1180420 AND DateNum()<=1180426,99,
IIf(DateNum()>=1180427 AND DateNum()<=1180503,100,IIf(DateNum()>=1180504 AND DateNum()<=1180510,101,IIf(DateNum()>=1180511 AND DateNum()<=1180517,102,IIf(DateNum()>=1180518 AND DateNum()<=1180524,103,
IIf(DateNum()>=1180525 AND DateNum()<=1180531,104,IIf(DateNum()>=1180601 AND DateNum()<=1180607,105,IIf(DateNum()>=1180608 AND DateNum()<=1180614,106,IIf(DateNum()>=1180615 AND DateNum()<=1180621,107,
IIf(DateNum()>=1180622 AND DateNum()<=1180628,108,IIf(DateNum()>=1180629 AND DateNum()<=1180705,109,IIf(DateNum()>=1180706 AND DateNum()<=1180712,110,IIf(DateNum()>=1180713 AND DateNum()<=1180719,111,
IIf(DateNum()>=1180720 AND DateNum()<=1180726,112,IIf(DateNum()>=1180727 AND DateNum()<=1180802,113,IIf(DateNum()>=1180803 AND DateNum()<=1180809,114,IIf(DateNum()>=1180810 AND DateNum()<=1180816,115,
IIf(DateNum()>=1180817 AND DateNum()<=1180823,116,IIf(DateNum()>=1180824 AND DateNum()<=1180830,117,IIf(DateNum()>=1180831 AND DateNum()<=1180906,118,IIf(DateNum()>=1180907 AND DateNum()<=1180912,119,
IIf(DateNum()>=1180914 AND DateNum()<=1180919,120,IIf(DateNum()>=1180921 AND DateNum()<=1180927,121,IIf(DateNum()>=1180928 AND DateNum()<=1181004,122,IIf(DateNum()>=1181005 AND DateNum()<=1181011,123,
IIf(DateNum()>=1181012 AND DateNum()<=1181017,124,IIf(DateNum()>=1181019 AND DateNum()<=1181025,125,IIf(DateNum()>=1181026 AND DateNum()<=1181101,126,IIf(DateNum()>=1181102 AND DateNum()<=1181108,127,
IIf(DateNum()>=1181109 AND DateNum()<=1181115,128,IIf(DateNum()>=1181116 AND DateNum()<=1181122,129,IIf(DateNum()>=1181123 AND DateNum()<=1181129,130,IIf(DateNum()>=1181130 AND DateNum()<=1181206,131,
IIf(DateNum()>=1181207 AND DateNum()<=1181213,132,IIf(DateNum()>=1181214 AND DateNum()<=1181220,133,IIf(DateNum()>=1181221 AND DateNum()<=1181227,134,IIf(DateNum()>=1181228 AND DateNum()<=1190103,135,
IIf(DateNum()>=1190104 AND DateNum()<=1190110,136,IIf(DateNum()>=1190111 AND DateNum()<=1190117,137,IIf(DateNum()>=1190118 AND DateNum()<=1190124,138,IIf(DateNum()>=1190125 AND DateNum()<=1190131,139,
IIf(DateNum()>=1190201 AND DateNum()<=1190207,140,IIf(DateNum()>=1190208 AND DateNum()<=1190214,141,IIf(DateNum()>=1190215 AND DateNum()<=1190221,142,IIf(DateNum()>=1190222 AND DateNum()<=1190228,143,
IIf(DateNum()>=1190301 AND DateNum()<=1190307,144,IIf(DateNum()>=1190308 AND DateNum()<=1190314,145,IIf(DateNum()>=1190315 AND DateNum()<=1190320,146,IIf(DateNum()>=1190322 AND DateNum()<=1190328,147,
IIf(DateNum()>=1190329 AND DateNum()<=1190404,148,IIf(DateNum()>=1190405 AND DateNum()<=1190411,149,IIf(DateNum()>=1190412 AND DateNum()<=1190418,150,IIf(DateNum()>=1190419 AND DateNum()<=1190425,151,
IIf(DateNum()>=1190426 AND DateNum()<=1190502,152,IIf(DateNum()>=1190503 AND DateNum()<=1190509,153,IIf(DateNum()>=1190510 AND DateNum()<=1190516,154,IIf(DateNum()>=1190517 AND DateNum()<=1190523,155,
IIf(DateNum()>=1190524 AND DateNum()<=1190530,156,IIf(DateNum()>=1190531 AND DateNum()<=1190606,157,IIf(DateNum()>=1190607 AND DateNum()<=1190613,158,IIf(DateNum()>=1190614 AND DateNum()<=1190620,159,
IIf(DateNum()>=1190621 AND DateNum()<=1190627,160,IIf(DateNum()>=1190628 AND DateNum()<=1190704,161,IIf(DateNum()>=1190705 AND DateNum()<=1190711,162,IIf(DateNum()>=1190712 AND DateNum()<=1190718,163,
IIf(DateNum()>=1190719 AND DateNum()<=1190725,164,IIf(DateNum()>=1190726 AND DateNum()<=1190801,165,IIf(DateNum()>=1190802 AND DateNum()<=1190808,166,IIf(DateNum()>=1190809 AND DateNum()<=1190814,167,
IIf(DateNum()>=1190816 AND DateNum()<=1190822,168,IIf(DateNum()>=1190823 AND DateNum()<=1190829,169,IIf(DateNum()>=1190830 AND DateNum()<=1190905,170,IIf(DateNum()>=1190906 AND DateNum()<=1190912,171,
IIf(DateNum()>=1190913 AND DateNum()<=1190919,172,IIf(DateNum()>=1190920 AND DateNum()<=1190926,173,IIf(DateNum()>=1190927 AND DateNum()<=1191003,174,IIf(DateNum()>=1191004 AND DateNum()<=1191010,175,
IIf(DateNum()>=1191011 AND DateNum()<=1191017,176,IIf(DateNum()>=1191018 AND DateNum()<=1191024,177,IIf(DateNum()>=1191025 AND DateNum()<=1191031,178,IIf(DateNum()>=1191101 AND DateNum()<=1191107,179,
IIf(DateNum()>=1191108 AND DateNum()<=1191114,180,IIf(DateNum()>=1191115 AND DateNum()<=1191121,181,IIf(DateNum()>=1191122 AND DateNum()<=1191128,182,IIf(DateNum()>=1191129 AND DateNum()<=1191205,183,
IIf(DateNum()>=1191206 AND DateNum()<=1191212,184,IIf(DateNum()>=1191213 AND DateNum()<=1191219,185,IIf(DateNum()>=1191220 AND DateNum()<=1191226,186,IIf(DateNum()>=1191227 AND DateNum()<=1200102,187,
IIf(DateNum()>=1200103 AND DateNum()<=1200109,188,IIf(DateNum()>=1200110 AND DateNum()<=1200116,189,IIf(DateNum()>=1200117 AND DateNum()<=1200123,190,IIf(DateNum()>=1200124 AND DateNum()<=1200130,191,
IIf(DateNum()>=1200131 AND DateNum()<=1200206,192,IIf(DateNum()>=1200207 AND DateNum()<=1200213,193,IIf(DateNum()>=1200214 AND DateNum()<=1200220,194,IIf(DateNum()>=1200221 AND DateNum()<=1200227,195,
IIf(DateNum()>=1200228 AND DateNum()<=1200305,196,IIf(DateNum()>=1200306 AND DateNum()<=1200312,197,IIf(DateNum()>=1200313 AND DateNum()<=1200319,198,IIf(DateNum()>=1200320 AND DateNum()<=1200326,199,
IIf(DateNum()>=1200327 AND DateNum()<=1200401,200,IIf(DateNum()>=1200403 AND DateNum()<=1200409,201,IIf(DateNum()>=1200410 AND DateNum()<=1200416,202,IIf(DateNum()>=1200417 AND DateNum()<=1200423,203,
IIf(DateNum()>=1200424 AND DateNum()<=1200430,204,IIf(DateNum()>=1200501 AND DateNum()<=1200507,205,IIf(DateNum()>=1200508 AND DateNum()<=1200514,206,IIf(DateNum()>=1200515 AND DateNum()<=1200521,207,
IIf(DateNum()>=1200522 AND DateNum()<=1200528,208,IIf(DateNum()>=1200529 AND DateNum()<=1200604,209,IIf(DateNum()>=1200605 AND DateNum()<=1200611,210,IIf(DateNum()>=1200612 AND DateNum()<=1200618,211,
IIf(DateNum()>=1200619 AND DateNum()<=1200625,212,IIf(DateNum()>=1200626 AND DateNum()<=1200702,213,IIf(DateNum()>=1200703 AND DateNum()<=1200709,214,IIf(DateNum()>=1200710 AND DateNum()<=1200716,215,
IIf(DateNum()>=1200717 AND DateNum()<=1200723,216,IIf(DateNum()>=1200724 AND DateNum()<=1200730,217,IIf(DateNum()>=1200731 AND DateNum()<=1200806,218,IIf(DateNum()>=1200807 AND DateNum()<=1200813,219,
IIf(DateNum()>=1200814 AND DateNum()<=1200820,220,IIf(DateNum()>=1200821 AND DateNum()<=1200827,221,IIf(DateNum()>=1200828 AND DateNum()<=1200903,222,IIf(DateNum()>=1200904 AND DateNum()<=1200910,223,
IIf(DateNum()>=1200911 AND DateNum()<=1200917,224,IIf(DateNum()>=1200918 AND DateNum()<=1200924,225,IIf(DateNum()>=1200925 AND DateNum()<=1201001,226,IIf(DateNum()>=1201002 AND DateNum()<=1201008,227,
IIf(DateNum()>=1201009 AND DateNum()<=1201015,228,IIf(DateNum()>=1201016 AND DateNum()<=1201022,229,IIf(DateNum()>=1201023 AND DateNum()<=1201029,230,IIf(DateNum()>=1201030 AND DateNum()<=1201105,231,
IIf(DateNum()>=1201106 AND DateNum()<=1201112,232,IIf(DateNum()>=1201113 AND DateNum()<=1201119,233,IIf(DateNum()>=1201120 AND DateNum()<=1201126,234,IIf(DateNum()>=1201127 AND DateNum()<=1201203,235,
IIf(DateNum()>=1201204 AND DateNum()<=1201210,236,IIf(DateNum()>=1201211 AND DateNum()<=1201217,237,IIf(DateNum()>=1201218 AND DateNum()<=1201224,238,IIf(DateNum()>=1201225 AND DateNum()<=1201231,239,
IIf(DateNum()>=1210101 AND DateNum()<=1210107,240,IIf(DateNum()>=1210108 AND DateNum()<=1210114,241,IIf(DateNum()>=1210115 AND DateNum()<=1210121,242,IIf(DateNum()>=1210122 AND DateNum()<=1210128,243,
IIf(DateNum()>=1210129 AND DateNum()<=1210204,244,IIf(DateNum()>=1210205 AND DateNum()<=1210211,245,IIf(DateNum()>=1210212 AND DateNum()<=1210218,246,IIf(DateNum()>=1210219 AND DateNum()<=1210225,247,
IIf(DateNum()>=1210226 AND DateNum()<=1210304,248,IIf(DateNum()>=1210305 AND DateNum()<=1210310,249,IIf(DateNum()>=1210312 AND DateNum()<=1210318,250,IIf(DateNum()>=1210319 AND DateNum()<=1210325,251,
IIf(DateNum()>=1210326 AND DateNum()<=1210401,252,IIf(DateNum()>=1210402 AND DateNum()<=1210408,253,IIf(DateNum()>=1210409 AND DateNum()<=1210415,254,IIf(DateNum()>=1210416 AND DateNum()<=1210422,255,
IIf(DateNum()>=1210423 AND DateNum()<=1210429,256,IIf(DateNum()>=1210430 AND DateNum()<=1210506,257,IIf(DateNum()>=1210507 AND DateNum()<=1210512,258,IIf(DateNum()>=1210514 AND DateNum()<=1210520,259,
IIf(DateNum()>=1210521 AND DateNum()<=1210527,260,IIf(DateNum()>=1210528 AND DateNum()<=1210603,261,IIf(DateNum()>=1210604 AND DateNum()<=1210610,262,IIf(DateNum()>=1210611 AND DateNum()<=1210617,263,
IIf(DateNum()>=1210618 AND DateNum()<=1210624,264,IIf(DateNum()>=1210625 AND DateNum()<=1210701,265,IIf(DateNum()>=1210702 AND DateNum()<=1210708,266,IIf(DateNum()>=1210709 AND DateNum()<=1210715,267,
IIf(DateNum()>=1210716 AND DateNum()<=1210722,268,IIf(DateNum()>=1210723 AND DateNum()<=1210729,269,IIf(DateNum()>=1210730 AND DateNum()<=1210805,270,IIf(DateNum()>=1210806 AND DateNum()<=1210812,271,
IIf(DateNum()>=1210813 AND DateNum()<=1210818,272,IIf(DateNum()>=1210820 AND DateNum()<=1210826,273,IIf(DateNum()>=1210827 AND DateNum()<=1210902,274,IIf(DateNum()>=1210903 AND DateNum()<=1210909,275,
IIf(DateNum()>=1210910 AND DateNum()<=1210916,276,IIf(DateNum()>=1210917 AND DateNum()<=1210923,277,IIf(DateNum()>=1210924 AND DateNum()<=1210930,278,IIf(DateNum()>=1211001 AND DateNum()<=1211007,279,
IIf(DateNum()>=1211008 AND DateNum()<=1211014,280,IIf(DateNum()>=1211015 AND DateNum()<=1211021,281,IIf(DateNum()>=1211022 AND DateNum()<=1211028,282,IIf(DateNum()>=1211029 AND DateNum()<=1211103,283,
IIf(DateNum()>=1211105 AND DateNum()<=1211111,284,IIf(DateNum()>=1211112 AND DateNum()<=1211118,285,IIf(DateNum()>=1211119 AND DateNum()<=1211125,286,IIf(DateNum()>=1211126 AND DateNum()<=1211202,287,
IIf(DateNum()>=1211203 AND DateNum()<=1211209,288,IIf(DateNum()>=1211210 AND DateNum()<=1211216,289,IIf(DateNum()>=1211217 AND DateNum()<=1211223,290,IIf(DateNum()>=1211224 AND DateNum()<=1211230,291,
IIf(DateNum()>=1211231 AND DateNum()<=1220106,292,293)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));

Strike=(Round(Round(Close)/STK_Diff)*STK_Diff);
str_count=StrCount(dt_list,",")+1;
//
dt=DateTime();
start_dt0=DateTimeConvert(2,1160603,0);
end_dt0  =DateTimeConvert(2,1160609,235959);
//
Expi_Select = 0;
prefix=StrReplace(Name(),"-I.NFO","");
appendix="CE.NFO";
for(i=0; i<str_count; i++)
{
amount = i*7;
start_dt = DateTimeAdd(start_dt0, amount, inDaily);
end_dt = DateTimeAdd(end_dt0, amount, inDaily);
//printf("exp: %s, start: %s, end: %s\n",StrExtract(dt_list,i),DateTimeToStr(start_dt),DateTimeToStr(end_dt));

Stk_Name=prefix+StrExtract(dt_list,i);
date_range=dt>=start_dt AND dt<=end_dt;
Expi_Select +=IIf(date_range,Foreign(Stk_Name+Strike+appendix,"C"),0);
}
Expi_Select=IIf(Expi_Select>0, Expi_Select, Null);
Plot(Expi_Select, "Price", colorDefault, styleline );

Call1=0;////Here i want to call the prices of the ATM_Call based the underlying asset price and the expiry for that date Like Foreign(Stk_Name+Strike+"CE.NFO","C")
Put1=0; ////Here i want to call the prices of the ATM_Put  based the underlying asset price and the expiry for that date  Like Foreign(Stk_Name+Strike+"PE.NFO","C")

Filter=1;
AddColumn(Close,"Fut_Close",10.2);
AddTextColumn(prefix,"Asset",30.0);
AddMultiTextColumn(Mul,List2,"Expiry",10.0);
AddColumn(Strike,"ATM_Strike",10.0);
AddTextColumn(appendix,"Opt",30.0);
AddColumn(Call1,"Call",10.2);
AddColumn(Put1,"Put",10.2);

With the help of all your selfless interests I have been able to reach this far...
Tried a few things but was not able to get the ATM_Call and Put prices based on expiry and rounded strike price into an array...
If only you all can help me clear and understand this part...
Call1=0;////Here i want to call the prices of the ATM_Call based the underlying asset price and the expiry for that date Like Foreign(Stk_Name+Strike+"CE.NFO","C")
Put1=0; ////Here i want to call the prices of the ATM_Put based the underlying asset price and the expiry for that date Like Foreign(Stk_Name+Strike+"PE.NFO","C")

@ashishshroff, I am not sure what you are looking for, however, your first post was to select the appropriate expiry on which you were struggling, for which @fxshrat has already given a nice solution.

However, as per your recent post, it seems you are struggling to calculate atm based on close price, which is resulting in you not been able to call appropriate asset price.

You can try this snippet to calculate the ATM / ITM / OTM and further use it in any form you want in your system. (However please use the appropriate Symbol Name based on your Data Provider).

if(Name() == "BANKNIFTY-I.NFO") {
ClosePrice = Foreign("BANKNIFTY","C"); iInterval = 100; _round = 50; step = 300;
}
if(Name() == "NIFTY-I.NFO") {
ClosePrice = Foreign("NIFTY","C"); iInterval = 50; _round = 25; step = 100; 
}

for (i=0;i<BarCount;i++)
{
	latest_price = ClosePrice[i];
	//find ATM using MROUND logic.
	if((latest_price%iInterval) > _round ) 
	{ 
	atm = (latest_price - (latest_price%iInterval)) + iInterval;
	}
	else 
	{ 
	atm = latest_price - (latest_price%iInterval);
	}
	
	iPE = atm; // ATM Put
	iCE = atm; //ATM Call
	iPE1 = iPE + step; // ITM PUT
	iCE1 = iCE - step; //ITM CALL
	iPE2 = iPE - step; //OTM PUT
	iCE2 = iCE + step; //OTM Call
}

Symbol = StrReplace(Name(),"-I.NFO","WK"); //Use appropriate symbol based your data provider.

newDay = Day()!= Ref( Day(), -1 );

iCEC = Foreign(Symbol+iCE+"CE","C"); // Atm Call Price
iPEC = Foreign(Symbol+iPE+"PE","C"); // Atm Put Price
iCEC = Foreign(Symbol+iCE1+"CE","C"); // ITM Call Price
iPEC = Foreign(Symbol+iPE1+"PE","C"); // ITM Put Price
iCEC = Foreign(Symbol+iCE2+"CE","C"); // OTM Call Price
iPEC = Foreign(Symbol+iPE2+"PE","C"); // OTM Put Price

Thanks sir let me try and getback...
:pray: I never knew I can find so many supporters and helpers here, really regret not coming to forum for the past 3 years...

you can debug the same using as follow.

_TRACE("Name : " + Name());
_TRACE("Close : " + C);
_TRACE("ATM Put: " + ipe);
_TRACE("ATM Call: " + ice);
_TRACE("ITM Put: " + ipe1);
_TRACE("ITM Call: " + ice1);
_TRACE("OTM Put: " + ipe2);
_TRACE("OTM Call: " + ice2);

A

I will try and explain again:
My ticker list has the has following convection : NIFTY + 18MAR21 + STRIKE_PRICE + CE.NFO
so like you replaced the "-I.NFO" with "WK" , I have to use the Expiry contract like "10MAR21" or "18MAR21". So if I want to foreign the price of 15000 call on 09th march i have to look for "10MAR21" Ticker but if i want it for 15th march i have to use "18MAR21"....
SINSE it is a string i can not iterate with iif(datenum()==1210309,"10MAR21",iif(datenum()==1210315,"18MAR21",""));
so i used writeif(datenum()==1210309,"10MAR21",writeif(datenum()==1210315,"18MAR21",""));
but it only returns a single value which is valid for the last data point of the exploration...

you have all the ingredient with you in above post the critical part has being already solved by @fxshrat you simply need to understand the code and use in the manner you wish to obtain for example

A

and I have given you the snippet to calculate the atm strike, you can simply merge them and get the desired result.

B

here is the merge code (Again please choose your Symbol Name as per your data provider).

/// @link https://forum.amibroker.com/t/writeif-returns-single-string-was-loop-string-for-selection-of-expiry/24649/12
dt_list = "07JAN21,14JAN21,21JAN21,28JAN21,04FEB21,11FEB21,18FEB21,25FEB21,"+
		"04MAR21,10MAR21,18MAR21,25MAR21,01APR21,08APR21,15APR21,22APR21,29APR21";
str_count = StrCount(dt_list, ",")+1;
//
dt = DateTime();
start_dt0 = DateTimeConvert(2, 1210101, 0);
end_dt0 = DateTimeConvert(2, 1210107, 235959);
//
Expi_Select = 0;
Symbol = StrReplace(Name(),"_I","");
prefix = Symbol;
appendix = "CE.NFO";
for ( i = 0; i < str_count; i++ ) {
	amount = i*7;
	start_dt = DateTimeAdd(start_dt0, amount, inDaily);
	end_dt = DateTimeAdd(end_dt0, amount, inDaily);		
	printf("exp: %s, start: %s, end: %s\n", 
	StrExtract(dt_list, i), DateTimeToStr(start_dt), DateTimeToStr(end_dt));
	expiry = StrExtract(dt_list, i);
	Stk_Name = prefix+StrExtract(dt_list, i)+appendix;
	date_range = dt >= start_dt && dt <= end_dt;
	Expi_Select += IIf(date_range, Foreign(Stk_Name, "C"), 0);
}

if(Name() == "BANKNIFTY_I") {
ClosePrice = Foreign("BANKNIFTY_I","C"); iInterval = 100; _round = 50; step = 300;
}
if(Name() == "NIFTY_I") {
ClosePrice = Foreign("NIFTY_I","C"); iInterval = 50; _round = 25; step = 100; 
}

for (j=0;j<BarCount;j++)
{
	latest_price = ClosePrice[j];
	//find ATM using MROUND logic.
	if((latest_price%iInterval) > _round ) 
	{ 
	atm = (latest_price - (latest_price%iInterval)) + iInterval;
	}
	else 
	{ 
	atm = latest_price - (latest_price%iInterval);
	}
	
	iPE = atm; // ATM Put
	iCE = atm; //ATM Call
	iPE1 = iPE + step; // ITM PUT
	iCE1 = iCE - step; //ITM CALL
	iPE2 = iPE - step; //OTM PUT
	iCE2 = iCE + step; //OTM Call
}

ATMPUT = Symbol+expiry+iPE+appendix;

//_TRACE("Stk_Name : " + Stk_Name);
//_TRACE("ATMPUT : " + ATMPUT);

Expi_Select = IIf(Expi_Select>0, Expi_Select, Null);

Plot( Expi_Select, "Price", colorDefault, styleHistogram );
1 Like

Please do not do that. It is not good code writing.

Here is update without any manual string lists.
NOTE: DateTimeFormat() %b USES YOUR OS LOCALE MONTH ABBREVIATION!
SEE YOUR OS LOCALE SETTINGS TO GET ENGLISH ONE!

/// @link https://forum.amibroker.com/t/writeif-returns-single-string-was-loop-string-for-selection-of-expiry/24649/18
/// NOTE: DateTimeFormat() %b USES YOUR OS LOCALE MONTH ABBREVIATION! SEE YOUR OS LOCALE SETTINGS TO GET ENGLISH ONE!
/// NOTE2: if you use intraday data then set time argument of lines ten and 
/// eleven to values other than NULL (also if you use >= daily interval) else if it is EOD data then set to NULL.
/// by fxshrat@gmail.com
dt = DateTime();
dow = DayOfWeek();
start_dn0 = 1160527;
end_dn0 = 1160602;
start_dt0 = DateTimeConvert(2, start_dn0, 0);
end_dt0 = DateTimeConvert(2, end_dn0, 235959);
last_dt = LastValue(dt);
mth_num = ceil(DateTimeDiff(last_dt,start_dt0)/(1440*60*7));
printf("mth_num: %g", mth_num);
//
txt_list = "\n";
Expi_Select = selector = 0;
prefix = StrExtract(Name(), 0, '-');
appendix = "CE.NFO";
for ( i = 0; i < mth_num; i++ ) {
	amount = i*7;
	start_dt = DateTimeAdd(start_dt0, amount, inDaily);
	end_dt = DateTimeAdd(end_dt0, amount, inDaily);
	expiry = StrToUpper(DateTimeFormat("%d%b%y",end_dt));
	txt_list += expiry + "\n";	
	//printf("exp: %s, start: %s, end: %s\n", 
	//expiry, DateTimeToStr(start_dt), DateTimeToStr(end_dt));
	
	Stk_Name = prefix+expiry+appendix;	
	date_range = dt >= start_dt AND dt <= end_dt;
	selector += date_range*(i+1);
	Expi_Select += IIf(date_range, Foreign(Stk_Name, "C"), 0);	
}
Expi_Select = IIf(Expi_Select>0, Expi_Select, Null);
Plot( Expi_Select, "Price", colorDefault );

Filter = dt >= start_dt0;
AddColumn(Close,"Fut_Close",1.2, -1,-1, 80);
AddTextColumn(prefix,"Asset",1, -1,-1, 80);
AddMultiTextColumn(selector,txt_list,"Expiry",1, -1,-1, 80);


There isn't BarCount loop required.

3 Likes

IF only the ticker name would have had "180321" instead of "18MAR21" I would have used IIf and life would have been not so complicated...

Exp_Select=iif(dateNum()>=1210305 and DateNum()<=1210311,11032021,iif(dateNum()>=1210311 and DateNum()<=1210318,18032021,0));
Call1=foreign("NIFTY"+Exp_Select+15000+"CE.NFO","C");
Put1=foreign("NIFTY"+Exp_Select+15000+"PE.NFO","C");

I would have had a single exploration for 5 years and had the result...
but coz of writeif i have to explore for 1 week at a time with start date and end date based on expiry.

Also I have to manually create the list coz there are some Thursday's when it's a holiday and expiry is moved to wednesday like on 10th March 21.