borilunad: Доброе утро, Артём! Да насчёт магиков ясно! Но когда что-то не в цикле, а в условиях типа if-else, достаточно будет только первым условием поставить if(Symbol()==mySymbol)(конечно, без else), предварительно представив mySymbol=Symbol()?! Чтобы все переменные всех экспертов были одинаковые, но каждый на своём графике! Пока не могу проверить, ещё пишу, "вымучиваю"! :)
Если string mySymbol=Symbol();, то в этой переменной будет значение текущего символа. Соответственно, для каждого советника, торгующего на своём графике, значение этой переменной будет равно значению символа, на котором запущен советник.
artmedia70: Если string mySymbol=Symbol();, то в этой переменной будет значение текущего символа. Соответственно, для каждого советника, торгующего на своём графике, значение этой переменной будет равно значению символа, на котором запущен советник.
Как-то не подумал о string'e! Пока вожусь с ошибками, вылезающими из апробированных функций, хорошо работающих в других экспертах! Спасибо большое!
//+------------------------------------------------------------------+//| cci on ma.mq4 |//| Copyright 2014, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"2005-2014, MetaQuotes Software Corp."#property link"https://www.mql4.com"#property strictinputdouble Lots =0.1;
inputint Expiration =5; //laikas minutemis//---- input parametersinputint cci_p = 89;
inputint ma = 13;
inputint NumberOfBarsToCalculate = 100;
inputstring comment=".csv or .txt";//коментарийinputstring FileType="csv";//тип файла datetime op_time=0,cl_time=0;
double op_price=0,cl_price=0;
int op_type=0;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTick(void)
{
int cnt,ticket,total;
//---if(Bars<cci_p+1)
{
Print("bars less than ",cci_p);
return;
}
//--- to simplify the coding and speed up access data are put into internal variablesdouble cci_dn=iCustom(NULL,0,"cci_ma",cci_p,ma,NumberOfBarsToCalculate,2,0);
double cci_up=iCustom(NULL,0,"cci_ma",cci_p,ma,NumberOfBarsToCalculate,3,0);
total=OrdersTotal();
if(total<1)
{
//--- check for long position (BUY) possibilityif(cci_up>0 && cci_up!=EMPTY_VALUE)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"cci sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
op_time=TimeLocal();
op_price=Close[0];
op_type=1;
Print("BUY order opened : ",OrderOpenPrice());
Print("op_price : ",op_price, "op_time : ",op_time);
}
elsePrint("Error opening BUY order : ",GetLastError());
return;
}
//--- check for short position (SELL) possibilityif(cci_dn<0 && cci_dn!=EMPTY_VALUE)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"cci sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
op_time=TimeLocal();
op_price=Close[0];
op_type=-1;
Print("BUY order opened : ",OrderOpenPrice());
Print("op_price : ",op_price, "op_time : ",op_time);
}
elsePrint("Error opening SELL order : ",GetLastError());
}
//--- exit from the "no opened orders" blockreturn;
}
//--- it is important to enter the market correctly, but it is more important to exit it correctly... for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
//--- long position is openedif(OrderType()==OP_BUY)
{
//--- should it be closed?if(TimeCurrent()>=op_time+Expiration*60)
{
//--- close order and exitif(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
cl_time=TimeCurrent();//op_time+Expiration*60;
cl_price=Close[0];
Print("OrderClose error ",GetLastError());
PrintToFile(op_price, cl_price, op_type, op_time, cl_time);
return;
}
}
else// go to short position
{
//--- should it be closed?if(TimeCurrent()>=op_time+Expiration*60)
{
//--- close order and exitif(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
cl_time=TimeCurrent();//op_time+Expiration*60;
cl_price=Close[0];
Print("OrderClose error ",GetLastError());
PrintToFile(op_price, cl_price, op_type, op_time, cl_time);
return;
}
}
}
}
//---
}
//+------------------------------------------------------------------+void PrintToFile(double opPrice=0,double clPrice=0,int opType=0, datetime opTime=0, datetime clTime=0)
{
string fileName=StringConcatenate(Symbol()," ",Period()," ","gi_EA_cci");
int handle;
handle=FileOpen(fileName+FileType, FILE_WRITE|FILE_READ,";");
if(handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",fileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- сначала запишем количество сигналовFileSeek(handle, 0, SEEK_END);
FileWrite(handle,
opPrice,
clPrice,
opType,
TimeToString(opTime,TIME_MINUTES|TIME_SECONDS),
TimeToString(clTime,TIME_MINUTES|TIME_SECONDS));
//--- закрываем файлFileClose(handle);
PrintFormat("Данные записаны, файл %s закрыт",fileName);
}
elsePrintFormat("Не удалось открыть файл %s, Код ошибки = %d",fileName,GetLastError());
}
beginner: Подскажите, как определить в сове снятие средств со счета?
Для некоторых "ордеров" OrderType() выдаёт значение, численно равное 6. Это и есть снятия и пополнения.
После удавшегося вызова OrderSelect() (возвращено true) можно определить размер снятия/пополнения по значению, возвращаемому из OrderProfit(), а по знаку этого значения - снятие это или пополнение...
Также некоторые брокеры взимают комиссию, имитируя снятие со счёта на сумму комиссии. Отделить взимание комисии от снятия со счёта можно пытаться по комментарию, получив его с помощью OrderComment().
Однако, следует быть осторожным: это всё недокументировано, может перестать работать в любой момент.
Уважаемые программисты! При оптимизации эксперта, я лично, думаю, как и многие другие участники, стараюсь найти максимум отношения прибыли к максимальной просадке (отношение: прибыль/просадка), как, мне кажется, наиболее важному показателю. Эту процедуру делаю вручную после завершения прогона тестера. Возможно-ли автоматизировать этот процесс? Или, как определяет каждый из Вас этот параметр? Заранее благодарен.
yosuf: Уважаемые программисты! При оптимизации эксперта, я лично, думаю, как и многие другие участники, стараюсь найти максимум отношения прибыли к максимальной просадке (отношение: прибыль/просадка), как, мне кажется, наиболее важному показателю. Эту процедуру делаю вручную после завершения прогона тестера. Возможно-ли автоматизировать этот процесс? Или, как определяет каждый из Вас этот параметр? Заранее благодарен.
я так делаю
//+---------------------- OnTester() --------------------------------+doubleOnTester()
{
double Result = 0;
double Profit = TesterStatistics(STAT_PROFIT);
double Drowdown = TesterStatistics(STAT_EQUITY_DD);
if(Drowdown>0)
Result = Profit/Drowdown;
else Result = 0;
return(NormalizeDouble(Result,2));
}
//+------------------------------------------------------------------+
Доброе утро, Артём! Да насчёт магиков ясно! Но когда что-то не в цикле, а в условиях типа if-else, достаточно будет только первым условием поставить if(Symbol()==mySymbol)(конечно, без else), предварительно представив mySymbol=Symbol()?! Чтобы все переменные всех экспертов были одинаковые, но каждый на своём графике! Пока не могу проверить, ещё пишу, "вымучиваю"! :)
Если string mySymbol=Symbol();, то в этой переменной будет значение текущего символа. Соответственно, для каждого советника, торгующего на своём графике, значение этой переменной будет равно значению символа, на котором запущен советник.
Печать в файл. На этом файле учюсь печатать.
Почему печатает нули в cl_time ?
Подскажите, как определить в сове снятие средств со счета?
Для некоторых "ордеров" OrderType() выдаёт значение, численно равное 6. Это и есть снятия и пополнения.
После удавшегося вызова OrderSelect() (возвращено true) можно определить размер снятия/пополнения по значению, возвращаемому из OrderProfit(), а по знаку этого значения - снятие это или пополнение...
Также некоторые брокеры взимают комиссию, имитируя снятие со счёта на сумму комиссии. Отделить взимание комисии от снятия со счёта можно пытаться по комментарию, получив его с помощью OrderComment().
Однако, следует быть осторожным: это всё недокументировано, может перестать работать в любой момент.
Уважаемые программисты! При оптимизации эксперта, я лично, думаю, как и многие другие участники, стараюсь найти максимум отношения прибыли к максимальной просадке (отношение: прибыль/просадка), как, мне кажется, наиболее важному показателю. Эту процедуру делаю вручную после завершения прогона тестера. Возможно-ли автоматизировать этот процесс? Или, как определяет каждый из Вас этот параметр? Заранее благодарен.
я так делаю
я так делаю
Извините, пожалуйста, я в программировании на МКЛ 0, укажите, пож., как это делается на практике?
Вставляем ту функцию в эксперта, выставляем
Имеем результат