Вопрос к программистам. Есть переменная которая имеет значение, но когда терминал перезагружается , то значение теряется. Возможно ли запоминать это значение, после перезагрузки мт4.
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Привет, может у кого есть или кто нибудь может помочь мне написать функцию которая :
Например,если стоит BuyStop,цена до него доходит и он преврашается в маркет ордер, то автоматически отлаживается противоположный SellStop
ордер в другом направлении на определенном расстоянии,потом если цена доходить до етого SellStop ордера ,также снова открывается противоположный ордер,и цикл повторяется.
Спасибо.
Вопрос к программистам. Есть переменная которая имеет значение, но когда терминал перезагружается , то значение теряется. Возможно ли запоминать это значение, после перезагрузки мт4.
Возможно. Сохранять значения во внешних файлах и при инициализации считывать настройки.
_http://codebase.mql4.com/ru/1025
Привет, может у кого есть или кто нибудь может помочь мне написать функцию которая :
Например,если стоит BuyStop,цена до него доходит и он преврашается в маркет ордер, то автоматически отлаживается противоположный SellStop
ордер в другом направлении на определенном расстоянии,потом если цена доходить до етого SellStop ордера ,также снова открывается противоположный ордер,и цикл повторяется.
Спасибо.
Советник Чебурашка на форуме Альпари.
Как можно узнать дистанцию от OrderOpenPrice() до 100 пипсовых круглых чисел?спасибо.
max = 1000;
min = 0;
for (i=min; i {
if(OrderOpenPrice() - i {
low = i; high = i+100*Point;
lengthtolow = OrderOpenPrice() - low;
lengthtohigh = high - OrderOpenPrice();
break;
}
}
как то так.
Сложновато предложили... Можно сделать без циклов и прочего, кажется вот так должно работать:
extern int Quality=100;- качество настраиваемого уровня
int mod=MathFloor(OrderOpenPrice()/(Quality*Point));
int ToLow=(OrderOpenPrice()-mod*Quality*Point)/Point;
int ToHigh=((mod+1)*Quality*Point-OrderOpenPrice())/Point;
Хотя сколько программистов столько и мнений :)
подскажите пожалуйста, что я делаю не так. уже неделю бьюсь над пробуемой, и не получается :((
нужно, что бы после выполнения функции перевода ордера в безубыток, открылся один отложенный ордер. У меня, почему то, открывается миллион отложенных ордеров
void MovingInWL(string sy="", int op=-1, int mn=-1) {
double po, pp;
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op if (mn po=MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY) {
if (OrderStopLoss()-OrderOpenPrice() pp=MarketInfo(OrderSymbol(), MODE_BID);
if (pp-OrderOpenPrice()>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
double ff= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, ff, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
if (OrderType()==OP_SELL) {
if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss() pp=MarketInfo(OrderSymbol(), MODE_ASK);
if (OrderOpenPrice()-pp>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
double fd= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, fd, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
}
}
}
}
}
подскажите пожалуйста, что я делаю не так. уже неделю бьюсь над пробуемой, и не получается :((
нужно, что бы после выполнения функции перевода ордера в безубыток, открылся один отложенный ордер. У меня, почему то, открывается миллион отложенных ордеровСпойлер
void MovingInWL(string sy="", int op=-1, int mn=-1) {
double po, pp;
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op if (mn po=MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY) {
if (OrderStopLoss()-OrderOpenPrice() pp=MarketInfo(OrderSymbol(), MODE_BID);
if (pp-OrderOpenPrice()>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
double ff= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, ff, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
if (OrderType()==OP_SELL) {
if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss() pp=MarketInfo(OrderSymbol(), MODE_ASK);
if (OrderOpenPrice()-pp>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
double fd= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, fd, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
}
}
}
}
}
так по коду и должно быть: кол-во новых ордеров = кол-ву открытых ордеров (каждый шаг цикла новый ордер).
поставь return(); после строчки ticket = OrderSend...
Изменено 5 декабря, 2013 пользователем shatun
Если нужен один, значит нужно так и написать: если ордеров (допустим) BuyStop нет, значит, ставим.
Функции подсчёта ордеров есть в уроках.
И лучше написать: if (OrderModify(.........) - т.е., если ордер модифицирован, значит, ставим отложку.
Ricedeni
Если нужен один, значит нужно так и написать: если ордеров (допустим) BuyStop нет, значит, ставим.
а если buystop есть, но по другим ценам?
Значит нужно внести нужную цену в переменную и по этой цене, больше не открывать.
Ricedeni
Значит нужно внести нужную цену в переменную и по этой цене, больше не открывать.
внести цену в переменную я могу, а как потом проверить, что Buystop уже есть по этой цене?
Функцию нужно писать.
Перебор ордеров.
Если символ, магик, тип (Buystop), цена (OrderOpenPrice()) = нашей переменной...
Да - не ставим ордер, нет - ставим.
внести цену в переменную я могу, а как потом проверить, что Buystop уже есть по этой цене?
Ну так а видеоуроки зачем писались? Вот например универсальная функция для проверки любых "наших" ордеров в рынке:
int CountTrades(int ordertype)
{
int Count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == ordertype)
Count ++;
}
}
return (Count);
}
Передаешь в нее нужный тип ордера и проверяешь, вариантов проверок на любой вкус, в твоем случае:
if (CountTrades(BUY_STOP) > 0)
то делаем то-то и то-то
Сделать подобную функцию проверки цен ордеров тоже не составит труда.
Изменено 5 декабря, 2013 пользователем JR
спасибо друзья
у меня вот интересный вопрос, как проверять есть ли соединение с сервером, для торговли? Обычное соединение явно было, ведь тики приходили, и на каждый тик отправлялся запрос, на открытие ордера. Но в журнале мы видим вот такую картинку...
Объясните пожалуйста, что тут произошло, и почему? Или это магическим образом пропала связь именно в эту минуту?
Вопрос уважаемым программистам. Как заставить советник торговать на offline М2 графике ренко (график генерируется индикатором RenkoLiveChart v2.1) ?
кинуть советник на график ренко - как вариант
кинуть советник на график ренко - как вариант
Так он и так там весит. Проблема в том, что не все советники торгуют на Renko. Как мне кажется, когда торгуешь на Renko в самом советнике должно что-то прописываться. Либо тот скрипт, индикатор или эксперт, которые формирует Renko график должны быть связаны каким-то образом в самом советнике с фукнциям покупки и продажи и т.д..... в общем, не знаю..
кинуть советник на график ренко - как вариант
Так он и так там весит. Проблема в том, что не все советники торгуют на Renko. Как мне кажется, когда торгуешь на Renko в самом советнике должно что-то прописываться. Либо тот скрипт, индикатор или эксперт, которые формирует Renko график должны быть связаны каким-то образом в самом советнике с фукнциям покупки и продажи и т.д..... в общем, не знаю..
Да ты прав с этим индикатором который прилагается к стратегии не получитться у меня получилось с другой совой генерирующей ренко графики. попробуй эту сову
xbms,Здравствуйте! Подскажите пожалуйста как закрыть большую пачку ордеров?
Набрал вот такой код,но что то он не работает:
void CLOSEORDER(int ord)
{
for (int i=0; i {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY && ord==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
if (OrderType()==OP_SELL && ord==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
}
}
}
}
Здравствуйте! Подскажите пожалуйста как закрыть большую пачку ордеров?
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Закрытие позиций по рыночной цене |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//+----------------------------------------------------------------------------+
void ClosePositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn }
}
}
}
}
void ClosePosBySelect() {
bool fc;
color clClose;
double ll, pa, pb, pp;
int err, it;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType()==OP_BUY) {
pp=pb; clClose=clCloseBuy;
} else {
pp=pa; clClose=clCloseSell;
}
ll=OrderLots();
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
if (fc) {
if (UseSound) PlaySound(NameFileSound); break;
} else {
err=GetLastError();
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Sleep(1000*5);
}
}
} else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}mzk_3om6u.Приветствую подскажи пожалуйста что это за переменная- NumberOfTry?
xbms,Здравствуйте! Подскажите пожалуйста как закрыть большую пачку ордеров?
Набрал вот такой код,но что то он не работает:
void CLOSEORDER(int ord)
{
for (int i=0; i {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY && ord==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
if (OrderType()==OP_SELL && ord==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
}
}
}
}
если нужно закрыть все открытые ордера, то тут можно просто поправить так:
void CLOSEORDER()
{
for (int i=0; i {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
if (OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
}
}
}
}
ну и разумеется эту функцию нужно вызвать из нужного места так: CLOSEORDER();
хотя в данном случае её логичней было бы обозвать уже CloseAllopenOrders; :)
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем