mobidik
-----
Покажите пожалуйста как правильно это делать:question:
Вам нужно узнать цену уже ранее открытого ордера или последнего закрытого?
Покажите пожалуйста как правильно это делать:question:
Вам нужно узнать цену уже ранее открытого ордера или последнего закрытого?
Если ранее открытого, то нужно либо при его открытии в отдельную переменную запоминать цену его открытия, либо использовать функцию, которая будет возвращать цену последнего открытого ордера - все зависит от алгоритма.Ранее открытого.
Если ранее открытого, то нужно либо при его открытии в отдельную переменную запоминать цену его открытия, либо использовать функцию, которая будет возвращать цену последнего открытого ордера - все зависит от алгоритма.
Ранее открытого.
//+------------------------------------------------------------------+
//| Get Open Last Order |
//+------------------------------------------------------------------+
double GetOpenLastOrder()
{
double prc = 0;
datetime lasttime = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(OrderOpenTime()>lasttime)
{
lasttime = OrderOpenTime();
prc = OrderOpenPrice();
}
}
}
}
}
return(prc);
}
//+------------------------------------------------------------------+
Функция вернет значение цены открытия самого последнего ордера, если в рынке еще не было ордеров по данной паре с данным меджиком, ф-ция вернет "0"
Ты ваще спишь, ??? Александр . mobidik :facepalm:
С НГ Тебя !!!!
Функция вернет значение цены открытия самого последнего ордера, если в рынке еще не было ордеров по данной паре с данным меджиком, ф-ция вернет "0"
Ты ваще спишь, ??? Александр . mobidik :facepalm:
С НГ Тебя !!!!
Привет.
спс, взаимно, С НГ и Рождеством!!!
Конечно сплю, в это время меньше отвлекают, имхо.
Без обид и я поздравляю с НГ (присоединяюсь к Элвису Бурундуку) но в коде нет разграничения по бай и селл, что для первоначального кода по-любому (опять же исходя из начально изложенного кода) есть разграничение по бай и селл. Поэтому в функции автоматическую проверку на бай и селл нужно убрать и сделать функцию более универсальной, но с хотя-бы с запросом на направление последнего ордера, если он был. Или с двумя функциями, которые возвращают цены открытия последних ордеров в каждом направлении или одной, но с входным параметром, определяющим направление, определяющим направлением.Технически оба варианта работают одинаково, но просто по-разному прописываются в теле сова. Если я не совсем правильно понял алгоритм (как сеточник с разным направление ордеров или мартин), то можно это сообщение не читать.)))Функция вернет значение цены открытия самого последнего ордера, если в рынке еще не было ордеров по данной паре с данным меджиком, ф-ция вернет "0":
Функция вернет значение цены открытия самого последнего ордера, если в рынке еще не было ордеров по данной паре с данным меджиком, ф-ция вернет "0":
PHP://+------------------------------------------------------------------+ //| Get Open Last Order | //+------------------------------------------------------------------+ double GetOpenLastOrder() { double prc = 0; datetime lasttime = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(OrderOpenTime()>lasttime) { lasttime = OrderOpenTime(); prc = OrderOpenPrice(); } } } } } return(prc); } //+------------------------------------------------------------------+
Спасибо за помощь, но задумка была такая:ордера открываются по тренду при выполнении условий входа но с проверкой дистанции до пред идущего ордера, и если при выполнении условий дистанция меньше установленной в настройках ордер не открывается и ждём следующего сигнала. И пока я морочу вам голову, ещё вопрос с которым сейчас я точно не справлюсь, использую индикатор "SupDem1", как написать условие:если при открытии ордера расстояние между ближайшими к цене уровнями поддержки и сопротивления X пунктов или меньше(изменяем алгоритм).
//+------------------------------------------------------------------+
//| Get Open Last Order |
//+------------------------------------------------------------------+
double GetOpenLastOrder(int type)
{
double prc = 0;
datetime lasttime = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==type)
{
if(OrderOpenTime()>lasttime)
{
lasttime = OrderOpenTime();
prc = OrderOpenPrice();
}
}
}
}
}
return(prc);
}
//+------------------------------------------------------------------+
Её вызов может быть таким:
double last_open_buy = GetOpenLastOrder(OP_BUY); // цена открытия последнего ордера BUY
double last_open_sell = GetOpenLastOrder(OP_SELL); // цена открытия последнего ордера SELL
//+------------------------------------------------------------------+
...использую индикатор "SupDem1", как написать условие:если при открытии ордера расстояние между ближайшими к цене уровнями поддержки и сопротивления X пунктов или меньше(изменяем алгоритм).
//+------------------------------------------------------------------+
//| Serch Sig Ind |
//+------------------------------------------------------------------+
double SerchSigInd(double &PrcUp, double &PrcDn)
{
PrcUp=-1;
PrcDn=-1;
int i = 1;
while(!IsStopped())
{
double sigup = DataInd(0,i);
double sigdn = DataInd(1,i);
if(PrcUp==-1 && sigup!=EMPTY_VALUE) PrcUp = sigup;
if(PrcDn==-1 && sigdn!=EMPTY_VALUE) PrcDn = sigdn;
if(PrcUp!=-1 || PrcDn!=-1) break; // Найден последний сигнал
if(i>=Bars)
{
Print("Не достаточно глубины истории.");
break;
}
i++;
}
return(0);
}
//+------------------------------------------------------------------+
//| Data Ind |
//+------------------------------------------------------------------+
double DataInd(int bf, int br)
{
return(iCustom(NULL,0,"SupDem1",bf,br));
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
double SigIndUp = -1;
double SigIndDn = -1;
SerchSigInd(SigIndUp, SigIndDn);
if(SigIndUp!=-1)
{
// есть от индикатора значение ближайшего уровня сверху
if(MathAbs(last_open_sell-Bid)/Point > Dist)
{
// если текущие растояние от последнего ордера SELL больше за Dist
}
}
if(SigIndDn!=-1)
{
// есть от индикатора значение ближайшего уровня снизу
if(MathAbs(last_open_buy-Ask)/Point > Dist)
{
// если текущие растояние от последнего ордера BUY больше за Dist
}
}
//+------------------------------------------------------------------+
...В общем усреднение и последний этап мне не дается. Хочется понять как это делается программно.
тебе же нужно смотреть не на ордера в рынке, а уже закрытые и вместо цены открытия получать: сперва профит ордера, если он убыточный - узнать с каким лотом был это ордер. Затем увеличиваем размер лота для новой позиции: лот закрытой позы * коеф. увеличения.
PS. в качестве примера, найди на форуме советники с мартином - там именно так и сделано, как тебе нужно.
Зачем мне узнавать с каким лотом он был закрыт, если мы знаем что он последний и если есть противоположный, который в работе? А если получаем профит имея рыночный и отложку у меня уже работает, отложка закрывается.
Ничего сложного, просто нужно сперва собрать все нужные данные и выполнить нужное действие.