История ордеров хранится на сервере. Ордера из неё удалить нельзя.Добрый вечер, я наверное не правильно выразился, возможно ли удалять из истории закрытые ордера, допустим при каких-то условиях история по данному символу стирается, если да, то как это прописать?
Нельзя в файл csv записать массив. Можно писать содержимое массива последовательно ячейку за ячейкой. А уже в каком порядке ячейки писать, зависит от того как потом удобнее будет читать.Вопрос: возможно ли в файл CSV записать трехмерный массив?
Для начала надо выбрать открытый ордер, например по тикету. Если тикет неизвестен, перебрать в цикле все открытые и выбрать нужный.Всем доброго дня ,подскажите как вернуть время открытия открытого ордера и время закрытия предыдущего ордера, а затем сравнить это время между собой?
Вроде бы(я так понял) в TimeCurrent() время в секундах с 1970 года. Можно ли тупо вычесть 300 из TimeCurrent()? чтобы узнать, что было 5 минут назад?
Типа:
PHP:if(OrderOpenTime() > TimeCurrent()-300) ...
Вполне можно.
Вопрос связан с настойчивостью хелпа метаэдитора по поводу формата datetime. Вроде как число секунд - 32разрядное целое, зачем мозги парить этим datetime, когда и так все работает? У меня связанные переменные объявлены int и используются для хранения секунд, например, разность Time[0] и TimeCurrent() - мне вроде как по барабану этот datetime или там какая-то подлость спрятана?![]()
Для начала надо выбрать открытый ордер, например по тикету. Если тикет неизвестен, перебрать в цикле все открытые и выбрать нужный.
Потом OrderOpenTime() вернёт время открытия ордера. Присвоить это значение datetime переменной.
Дальше в цикле перебрать все закрытые ордера присваивая datetime переменной время закрытия OrderCloseTime() и сравнивать их время закрытия. Самое большое время это время закрытия последнего ордера.
Потом останется сравнить переменную в которой время открытия с переменной в которой время закрытия.
start()
(
if(LastCloseTime()>LastOpenTime())
{Выполняемое действие}
return(0);
)
//----------
datetime LastOpenTime()
{
datetime time = 0;int i=0;
for( i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType()==OP_BUY)
{
if (OrderOpenTime()>0)
{
time=OrderOpenTime();
}
}
}
}
}
return(time);
}
//-----------
datetime LastCloseTime()
{
datetime time = 0;int i=0;
for( i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic1)
{
if (OrderCloseTime()>0)
{
time=OrderCloseTime();
}
}
}
}
return(time);
}
Ну во первых подсказали вам не так сделать. Вы сравниваете с нулем, что не имеет смысла. Надо так :Добрый день, у меня такая же проблема, все делал именно так, как вы подсказали, вместо тикета использую магик:Вот такой вариант почему-то не работает, подскажите пожалуйста в чем ошибка?PHP:start() ( if(LastCloseTime()>LastOpenTime()) {Выполняемое действие} return(0); ) //---------- datetime LastOpenTime() { datetime time = 0;int i=0; for( i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic) { if (OrderType()==OP_BUY) { if (OrderOpenTime()>0) { time=OrderOpenTime(); } } } } } return(time); } //----------- datetime LastCloseTime() { datetime time = 0;int i=0; for( i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic1) { if (OrderCloseTime()>0) { time=OrderCloseTime(); } } } } return(time); }
if (OrderOpenTime()>time)
{
time=OrderOpenTime();
}
Ну во первых подсказали вам не так сделать. Вы сравниваете с нулем, что не имеет смысла. Надо так :
И в принципе непонятно критерий выбора открытого ордера. Какой вам нужен то ли последний открытый то ли первый по времени. Или он всего у вас один.PHP:if (OrderOpenTime()>time) { time=OrderOpenTime(); }
По истории аналогично.
Во вторых использовать разные магики для проверки открытых и закрытых ордеров то же абсурд. Ведь магик открытого ордера при закрытии не меняется. Магик нужен советнику для отличия своих ордеров от чужих. Оставьте так && OrderMagicNumber() == Magic и для цикла по открытым и для цикла по закрытым ордерам. И не забудьте установить магик при открытии ордеров в функции OrderSend() Иначе опять вся эта конструкция не будет иметь смысла.
Ну тогда попробуйте разные переменные time сделать, типа time1 и time2. Возможно они у вас путаются так как одинаковые. А вообще трудновато подсказывать когда не видишь полный код.Спасибо, сравниваю с нулем, потому что уже прописывал то что вы мне посоветовали, но результат такой же... А насчет магика, то это разные ордера, я беру последний закрытый ордер из истории и сравниваю с временем открытого с другим магиком, он у меня кстати один с таким магиком, соответственно путаницы не должно быть, но это условие все равно не срабатывает(((
Ну тогда попробуйте разные переменные time сделать, типа time1 и time2. Возможно они у вас путаются так как одинаковые. А вообще трудновато подсказывать когда не видишь полный код.
start()
(
if(LastCloseTime()>LastOpenTime())
{
datetime o;
double l=-1,r=0;
int k=OrdersHistoryTotal(),t=-1;
for (int i=0; i<k; i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if (o<OrderCloseTime())
{
o=OrderCloseTime();
l=OrderLots();
t=OrderType();
r=OrderOpenPrice();
}
}
}
}
}
bool exists = false;
i=0;
for(i=OrdersTotal()-1; i>-1; i--)
if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == Magic8)
{
if(OrderType()>=0)
{
if(NormalizeDouble(OrderOpenPrice(), Digits) == NormalizeDouble(r, Digits))
{
exists = true;
break;
}
}
}
if(t==OP_BUY && !exists)// CountOrder(Magic8,OP_BUYLIMIT)==0)
{
OrderSend(Symbol(), OP_BUYLIMIT, l, NormalizeDouble(r,Digits), Slippage, 0, 0, "Покупка", Magic8, 0, Green);
}
if(t==OP_SELL && !exists)//CountOrder(Magic8,OP_SELLLIMIT)==0)
{
OrderSend(Symbol(), OP_SELLLIMIT, l, NormalizeDouble(r,Digits), Slippage, 0, 0, "Продажа", Magic8, 0, Green);
}
}
return(0);
)
//----------
datetime LastOpenTime()
{
datetime time1 = 0;int i=0;
for( i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType()==OP_BUY)
{
if (OrderOpenTime()>time1)
{
time1=OrderOpenTime();
}
}
}
}
}
return(time1);
}
//-----------
datetime LastCloseTime()
{
datetime time = 0;int i=0;
for( i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol()==Symbol())
{
if (OrderCloseTime()>time)
{
time=OrderCloseTime();
}
}
}
}
return(time);
}
datetime LastCloseTime()
{
datetime time = 0;int i=0;
for( i=OrdersHistoryTotal()-1; i>-1; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)
&& OrderType()<2 && OrderSymbol()==Symbol())
{
time = MathMax(OrderCloseTime(), time);
}
}
return (time);
}
Через 25 лет 32-разрядный счетчик секунд переполнится, и кто не спрятался, окажется опять в 1970 году.Я все таки стараюсь datetime использовать ,чтоб компилятор предупреждения не выдавал. А так то наверно без разницы. Все таки это целое число.
Через 25 лет 32-разрядный счетчик секунд переполнится, и кто не спрятался, окажется опять в 1970 году.