АвторСообщение





Сообщение: 877
Настроение: нормальное
Зарегистрирован: 20.10.14
Откуда: Россия
Репутация: 0
ссылка на сообщение  Отправлено: 13.10.16 14:47. Заголовок: Программирование.


Здравствуйте. Подскажите, почему ордер не открывается?

input int Slippage=30;
input int Magic=156;
input double Lot=0.1;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
double TP=0;
double cena_ma_1=0;
cena_ma_1=iMA(_Symbol,0,10,0,0,0,1);
int total=OrdersTotal();
for(int i=total-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS))
if(OrderSymbol()==Symbol())
{
double openB=OrderOpenPrice();
if(openB>cena_ma_1)
{
int tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,Slippage,0,TP,NULL,Magic,0,clrBlue);
{
Alert("Ордер открылся");
}
}
}
}


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 46 , стр: 1 2 3 4 All [только новые]





Сообщение: 37
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 13.10.16 15:32. Заголовок: А на основании чего ..


А на основании чего открывается ордер не понятно? Зачем цикл? Если это доливочный ордер, то имеет смысл использовать массив ордеров с маджиком.
Доливочный ордер открывается примерно так:
Был открыт ордер по какому-то условию и он был добавлен в массив ордеров советника по данному инструменту с маджиком. К нему, уже при других условиях добавляются ордера как-то так

 цитата:

if(UseMAFilter == false || Bid > ma) //MA Filter
{
tArray[T] = OrderSend(Symbol(), OP_BUY, Lots, ask, slip*PipValue, bid - StopLoss*Point*PipValue, 0, Magic);
if(tArray[T]<0) {Alert("OrderSend Error: ", GetLastError());}
T++;





Спасибо: 1 
ПрофильЦитата Ответить





Сообщение: 2353
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 13.10.16 16:33. Заголовок: Эдуард пишет: Здрав..


Эдуард пишет:

 цитата:
Здравствуйте. Подскажите, почему ордер не открывается?


Эдуард, Вы здесь намешали мух с котлетами. Цикл, который Вы привели, обычно служит для нахождения ордеров по текущему символу. В этом цикле не должно быть команд торговых операций. Попробуйте запустить этот код онлайн на демо-счете, предварительно открыв хотя бы один ордер с ценой открытия выше МАшки. В итоге получите шквал открытых ордеров Buy.

В текущем же виде ордер никогда не будет открыт, т. к. Вы сравниваете цену открытия имеющегося ордера с ценой MA. Если ордера нет или если цена его открытия ниже МА, то новый ордер не будет открыт.
Сформулируйте, что именно Вы хотели получить от этого кода.


Спасибо: 1 
ПрофильЦитата Ответить





Сообщение: 878
Настроение: нормальное
Зарегистрирован: 20.10.14
Откуда: Россия
Репутация: 0
ссылка на сообщение  Отправлено: 13.10.16 17:17. Заголовок: А так, почему на каж..


А так, почему на каждом тике открывает ?

input int Slippage=30;
input int Magic=156;
input double Lot=0.1;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
double TP=0;
double ma=0;
ma=iMA(_Symbol,0,10,0,0,0,1);

if(Open[0]>ma)
{
int tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,Slippage,0,TP,NULL,Magic,0,clrBlue);
{
Alert("Ордер открылся");
}
}
}


Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2354
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 13.10.16 17:56. Заголовок: Эдуард пишет: А так..


Эдуард пишет:

 цитата:
А так, почему на каждом тике открывает ?


Потому что Вы именно это и написали в коде: на каждом тике, если цена открытия свечи выше МАшки, то открывать ордер. Чтобы ордер открылся один раз, нужно предварительно произвести проверку, открывались уже ордера на текущей свече или нет. То есть циклом из первого Вашего поста собрать информацию, потом проанализировать ее и только затем выполнять код, приведенный во втором посте.

Спасибо: 1 
ПрофильЦитата Ответить





Сообщение: 879
Настроение: нормальное
Зарегистрирован: 20.10.14
Откуда: Россия
Репутация: 0
ссылка на сообщение  Отправлено: 13.10.16 18:16. Заголовок: Не открывает... in..


Не открывает...

input int Slippage=30;
input int Magic=156;
input double Lot=0.1;
input double TakeProfit=200;

double TP=0;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
TP=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
TP=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);
double ma=0;
ma=iMA(_Symbol,0,10,0,0,0,1);
int total=OrdersTotal();
for(int i=total-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS))
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY && OrderMagicNumber()==Magic)
if(Open[0]>ma)
{
int tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,Slippage,0,TP,NULL,Magic,0,clrBlue);
{
Alert("Ордер открылся");
}
}
}
}

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2355
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 13.10.16 18:44. Заголовок: Эдуард пишет: Не от..


Эдуард пишет:

 цитата:
Не открывает...


Давайте так: что именно нужно?

Спасибо: 1 
ПрофильЦитата Ответить





Сообщение: 880
Настроение: нормальное
Зарегистрирован: 20.10.14
Откуда: Россия
Репутация: 0
ссылка на сообщение  Отправлено: 13.10.16 18:51. Заголовок: Scriptong пишет: Ко..


Scriptong пишет:

 цитата:



Когда свеча закрывается выше мувинга - Бай. Когда ниже Селл. Хотелось бы понять, что не так.
Код писать не надо, он мне не нужен в принципе.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2356
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 13.10.16 19:57. Заголовок: Эдуард пишет: Когда..


Эдуард пишет:

 цитата:
Когда свеча закрывается выше мувинга - Бай.


В частностях у Вас все верно. А вот собрано - неверно. Так, условие открытия написано верно:

 цитата:

double ma = iMA(...);
if (Open[0] > ma)
{
// Открыть Buy
}
if (Open[0] < ma)
{
// Открыть Sell
}



Эдуард пишет:

 цитата:
Хотелось бы понять, что не так.


Не так то, что перед открытием необходимо проверить наличие уже открытых ордеров на текущей свече. Иначе Вы на каждом тике будете открывать новый ордер. Для определения времени последнего открытого ордера используйте код наподобие такого:

 цитата:

datetime GetLastOpenOrderTime()
{
datetime lastOpenOrderTime = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS))
continue;

if (OrderSymbol() != Symbol())
continue;

if (OrderType() != OP_BUY && OrderType() != OP_SELL)
continue;

if (OrderMagicNumber() != i_magicNumber)
continue;

lastOpenOrderTime = (datetime)MathMax(lastOpenOrderTime, OrderOpenTime());
}

return lastOpenOrderTime;

}



Поэтому перед открытие нового ордера проверяйте время открытия последнего ордера путем сравнения времени открытия свечи и результата, который вернула функция GetLastOpenOrderTime().

 цитата:

datetime lastTime = GetLastOpenOrderTime();
if (lastTime >= Time[0])
{
// Новый ордер открывать нельзя, т. к. на этой свече уже был открыт ордер
}



Эдуард пишет:

 цитата:
Код писать не надо, он мне не нужен в принципе.


Тогда непонятно, зачем сюда пишете... Здесь ведь именно коды и обсуждаются.


Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 881
Настроение: нормальное
Зарегистрирован: 20.10.14
Откуда: Россия
Репутация: 0
ссылка на сообщение  Отправлено: 13.10.16 19:59. Заголовок: Буду разбираться. Сп..


Буду разбираться.
Спасибо.


Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 882
Настроение: нормальное
Зарегистрирован: 20.10.14
Откуда: Россия
Репутация: 0
ссылка на сообщение  Отправлено: 16.10.16 11:57. Заголовок: Почему выдает ошибку..


Почему выдает ошибку ?

void OnTick()
{
int tiket=0;
if(OP_BUY==0)
tiket=OrderSend(_Symbol,OP_BUY,0.1,Ask,10,0,0,NULL,123,0,clrBlue);
if(tiket>=0)return(true);
else return(false);
if(OP_SELL==0)
tiket=OrderSend(_Symbol,OP_SELL,0.1,Bid,10,0,0,NULL,123,0,clrRed);
if( tiket>=0)return(true);
else return(false);
}

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2362
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 17.10.16 14:48. Заголовок: Эдуард пишет: Почем..


Эдуард пишет:

 цитата:
Почему выдает ошибку ?


Имеется в виду ошибка компиляции? Если да, то компилятор указывает на то, что функция OnTick имеет тип void (т. е. без типа), а в теле функции четыре функции return возвращают значение. Нужно убрать возврат значения.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 883
Настроение: нормальное
Зарегистрирован: 20.10.14
Откуда: Россия
Репутация: 0
ссылка на сообщение  Отправлено: 16.10.16 12:07. Заголовок: Когда надо делать пе..


Когда надо делать перебор ордеров ?
1. Когда открываем ордера.
2. Закрываем.
3. Модифицируем.
Когда еще ?

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2363
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 17.10.16 14:51. Заголовок: Эдуард пишет: Когда..


Эдуард пишет:

 цитата:
Когда надо делать перебор ордеров ?


Один раз в начале обработки события Tick или любого другого события. Собираем свои ордера в массив, а потом уже работаем с этим массивом. После выполнения любой торговой операции, если она успешна, необходимо вернуться к месту входа в функцию обработки события. Таким образом, сбор информации будет проведен еще один раз. И так до тех пор, пока не будет в очереди торговых операций, либо любая выполненная торговая операция приведет к ошибке. В случае ошибки (опять же - нужно обработать саму ошибку) следует закончить обработку события и ждать следующего события.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 884
Настроение: нормальное
Зарегистрирован: 20.10.14
Откуда: Россия
Репутация: 0
ссылка на сообщение  Отправлено: 24.10.16 21:20. Заголовок: Подскажите на пример..


Подскажите на примере части кода. Какое условие прописать, чтобы ордера на одном уровне открывались так: Бай/Селл, то есть чередовались.

if(Tipordera(Magik)==1 && Ask>=LastPrice+step*_Point && LastPrice>0 && (Magik))
{
tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,Slippage,0,0,"",Magik,0,clrBlue);
LastPrice=Ask;
}

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2367
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 25.10.16 09:00. Заголовок: Эдуард пишет: Подск..


Эдуард пишет:

 цитата:
Подскажите на примере части кода. Какое условие прописать, чтобы ордера на одном уровне открывались так: Бай/Селл, то есть чередовались.


Не существует какого-то условия, чтобы его написал - и получил желаемое. Чаще всего, как и в этом случае, требуется составление целого алгоритма. Насколько я понял задачу, требуется:
    1. После открытия первого ордера, например, Buy, ожидаем его закрытия по стопу, профиту или по рынку (принудительное закрытие).
    2. По закрытию ордера ожидаем возврата цены к уровню открытия Buy и открываем Sell.
    3. Ожидание закрытия Sell.
    4. Ожидание возврата цены к уровню открытия Sell и открытие Buy.


Такой алгоритм нужен? Даже если он, то это несколько сотен строк кода.
Ну и в самом алгоритме еще такой момент не предусмотрен: а что, если цена не вернется к начальному уровню открытия?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 46 , стр: 1 2 3 4 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  2 час. Хитов сегодня: 49
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет