仕事が完了した
指定
I am very novice in programming a robot and I would like to develop the following EA. Overall the robot is looping continuously over a large number of symbols performing a few calculations on those symbols prices and deciding if it wants to buy or sell. I want no two open positions for the same symbol and also no position exchange (no positions should be closed to open new ones). For each open position of a symbol, the robot will need to find the buying price for that position and the day the position was opened as this is important information for determining the selling point.
I am not sure if one script can loop over several symbols (some users suggest that each tick function can only be employed on a single symbol). I am open to your suggestions (possibly copying pasting the code multiple times to scan various symbols or similar solution. I will need a couple of market days to test the code myself. See below for full annotation:
void OnTick()
{
\\ Define a list of codes (approximately 500 codes in reality) to be checked. I have unsuccessfully tried defining an array and looping through those symbols. Possibly this is not the right solution (maybe you need to run OnTicks for each code separately. )
string symbol_array[]={"XOM","AAL","ABNB"};
int number_of_symbols=ArraySize(symbol_array);
Print("Total number of symbols is =",number_of_symbols);
for(int symbol_position=1;symbol_position<=number_of_symbols;symbol_position++)
{string stockname=symbol_array[symbol_position];
Print("Current symbol is =",stockname);
double Current_close = iClose(stockname,PERIOD_M1,0);
double Close_minus1 = iClose(stockname,PERIOD_M1,1);
double Close_minus2 = iClose(stockname,PERIOD_M1,2);
double Close_minus3 = iClose(stockname,PERIOD_M1,3);
double High_minus_1day = iHigh(stockname,PERIOD_D1,1);
double High_minus_2day = iHigh(stockname,PERIOD_D1,2);
double High_minus_3day = iHigh(stockname,PERIOD_D1,3);
double High_minus_4day = iHigh(stockname,PERIOD_D1,4);
double High_minus_5day = iHigh(stockname,PERIOD_D1,5);
double High_minus_6day = iHigh(stockname,PERIOD_D1,6);
double High_minus_7day = iHigh(stockname,PERIOD_D1,7);
double High_minus_8day = iHigh(stockname,PERIOD_D1,8);
double Trending_pattern = (High_minus_4day+High_minus_3day+High_minus_2day+High_minus_1day) - (High_minus_8day+High_minus_7day+High_minus_6day+High_minus_5day);
double Percentage_move3 = (Current_close-Close_minus3)/Close_minus3;
double Percentage_move2 = (Current_close-Close_minus2)/Close_minus2;
double Percentage_move1 = (Current_close-Close_minus1)/Close_minus1;
double Local_derivative = Close_minus2/2 - 2*Close_minus1 +3*Current_close/2;
\\ Generate a buy signal IF Trending_pattern>0 && Local_derivative>0.05 && NO orders are pending for this code and NO positions are open for this code.
I do not want to exchange (close positions to open new ones) any currently open position. I do not know how to implement the 'NO orders should be pending and the 'NO open positions should exist for this code' parts. Please help me with this.
//buy signal
if ( Trending_pattern>0 && Local_derivative>0.05 && OrdersTotal()==0 )
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- parameters of request
request.action =TRADE_ACTION_DEAL; // type of trade operation
request.symbol =stockname; // symbol
request.volume =1; // volume of 0.1 lot
request.type =ORDER_TYPE_BUY; // order type
request.deviation=5;
OrderSend(request,result);
}
\\ Generate a SELL signal IF 'the current selling price Current_close of an open position for the current code is 1.1 times the price I have bought it in the past' OR 'the position for this code was opened more than 3 days ago'.
I do not know how to implement either of these 2 conditions. Please help me with that.
//sell signal
if (Current_close >1.1*Price_paid_for_position)
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- parameters of request
request.action =TRADE_ACTION_DEAL; // type of trade operation
request.symbol =stockname; // symbol
request.volume =0.1; // volume of 0.1 lot
request.type =ORDER_TYPE_SELL; // order type
request.deviation=5;
OrderSend(request,result);
}
\\ The above calculation has to loop over all codes included in the symbol_array string one by one for an indefinite amount of time.