В учебнике читал, но там смутно написано... Мне неясно как в программе можно выбрать именно тот ордер для его закрытия, который мне нужен?
Пожалуйсто если есть возможность, приведите простые примеры с описанием!
Вам прийдется пересмотреть все ордера и найти нужный Вам ордер по внешним признакам: цена открытия, P/L, размер лота и др.
Вам прийдется пересмотреть все ордера и найти нужный Вам ордер по внешним признакам: цена открытия, P/L, размер лота и др.
я пробовал это сделать с помощью OrderType(), но может вписал не так, ордер не закрывается
extern double Lots=0.04;
extern int K=5;
extern int D=3;
extern int Z=3;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start() // Спец. функция start
{
double M_0, M_1, // Значение MAIN на 0 и 1 барах
S_0, S_1; // Значение SIGNAL на 0 и 1барах
int ticket, kolichectvoorderov,order_type;
//--------------------------------------------------------------------
// Обращение к функции техн.индикат.
M_0 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_MAIN, 0);// 0 бар,M_0 на нулевом баре имеет это значение
M_1 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_MAIN, 1);// 1 бар,M_1 на предыдущем баре имеет это значение
S_0 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_SIGNAL,0);// 0 бар,S_0 на нулевом баре имеет это значение
S_1 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_SIGNAL,1);// 1 бар,S_1 на предыдущем баре имеет это значение
//--------------------------------------------------------------------
// описание вводимых данных в осцилятор стокхастик
//-------------------------------------------------------------------------------------------------------------------------+
//double iStochastic(string symbol, int timeframe, int %Kperiod, int %Dperiod, +
// int slowing, int method, int price_field, int mode, int shift) +
// symbol - символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ. +
// timeframe - период. Может быть одним из периодов графика. 0 означает период текущего графика. +
// %Kperiod - период(количество баров) для вычисления линии %K. +
// %Dperiod - период усреднения для вычисления линии %D. +
// slowing - значение замедления. +
// method - метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average): +
// MODE_SMA -0- Простое скользящее среднее; +
// MODE_EMA -1- Экспоненциальное скользящее среднее; +
// MODE_SMMA -2- Сглаженное скользящее среднее; +
// MODE_LWMA -3- Линейно-взвешенное скользящее среднее; +
// price_field - Параметр выбора цен для расчета. Может быть одной из следующих величин: 0 - Low/High или 1 - Close/Close.+
// mode - индекс линии индикатора. Может принимать одно из значений: +
// MODE_MAIN -0- Основная линия или MODE_SIGNAL -1- Сигнальная линия +
// shift - индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара +
// на указанное количество периодов назад). +
// данные бара берутся с текущего -0- и дальше в обратную сторону 1,2,3,4....... +
//-------------------------------------------------------------------------------------------------------------------------+
kolichectvoorderov=OrdersTotal();
if(kolichectvoorderov<1)
{//-----------------------------------------------------------------------------------------------------------
if( M_0 >= S_0 && M_1 < S_1 )
{
Alert("сигнальная пересекает трендовую с верху вниз. открываем покупку.OP_BUY");
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0);
Print("BUY order opened : ",OrderOpenPrice());
OrderSelect( ticket,SELECT_BY_TICKET,MODE_TRADES);
if(OrderType()==OP_SELL)
{
OrderClose (ticket,Lots,Bid,2,Red);
}
return(0);
}
else
{
if( M_0 <= S_0 && M_1 > S_1 )
{
Alert("сигнальная пересекает трендовую снизу вверх открываем продажу OP_SELL.");
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0);
Print("SELL order opened : ",OrderOpenPrice());
OrderSelect( ticket,SELECT_BY_TICKET,MODE_TRADES);
if(OrderType()==OP_BUY)
{
OrderClose (ticket,Lots,Bid,2,Red);
}
return(0);
}
}
}
return(0);
}
В учебнике читал, но там смутно написано... Мне неясно как в программе можно выбрать именно тот ордер для его закрытия, который мне нужен?
Пожалуйсто если есть возможность, приведите простые примеры с описанием!
В учебнике есть просто СУПЕР ПРИМЕР самого простого советника. Там есть все, кроме Трейлинг стоп, который надо добавить самостоятельно. Остальное меняете только в блоке создания торговых сигналов на открытия и закрытия. Вот адрес: Учебник по MQL4 Простые программы на MQL4 Простой эксперт
я пробовал это сделать с помощью OrderType(), но может вписал не так, ордер не закрывается
{
.
.
for (int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderType()==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(Symbol(),MODE_SPREAD));
}}
.
.
.
if( M_0 >= S_0 && M_1 < S_1 )
{
.
.
for (int ii=0;ii<OrdersTotal();ii++)
{
if(OrderSelect(ii,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(Symbol(),MODE_SPREAD));
}}
ошибаетесь!
Тип ордера | Цена открытия | Цена закрытия | Цена открытия для отложенного ордера | Преобразование отложенного ордера в рыночный |
---|---|---|---|---|
Buy |
Ask |
Bid |
||
Sell |
Bid |
Ask |
||
BuyLimit |
Ниже текущей цены Ask | Ask достигает цены открытия | ||
SellLimit |
Выше текущей цены Bid | Bid достигает цены открытия | ||
BuyStop |
Выше текущей цены Ask | Ask достигает цены открытия | ||
SellStop |
Ниже текущей цены Bid | Bid достигает цены открытия |
{
if( summaord<1)
{
.
.
}
for (int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderType()==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(Symbol(),MODE_SPREAD));
}}
.
.
.
if( M_0 >= S_0 && M_1 < S_1 )
{
.
.
for (int ii=0;ii<OrdersTotal();ii++)
{
if(OrderSelect(ii,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(Symbol(),MODE_SPREAD));
}}
Константин, а не могли бы вы мне подсказать как и в какое место там трейлинг стоп вставить??? ну и стоп лосс тоже навсякий случай.. Пожалуйсто:)
вот мои функции которые упрощают трейлинг sl
int shag=10;
int tral_sl=100;
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+int orders_buy()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if((OrderType()==OP_BUY)&&(OrderSymbol()==Symbol()))j++;
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int orders_sell()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if((OrderType()==OP_SELL)&&(OrderSymbol()==Symbol()))j++;
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderStopLosS()
{double j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderStopLoss();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderOpenPricE()
{double j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderOpenPrice();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderTakeProfiT()
{double j=0;for(int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderTakeProfit();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int tiket()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderTicket();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int modify_sl_buy()
{
OrderModify(tiket(),OrderOpenPricE(),OrderStopLosS()+shag*Point,OrderTakeProfiT(),0);
Print(GetLastError());
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int modify_sl_sell()
{
OrderModify(tiket(),OrderOpenPricE(),OrderStopLosS()-shag*Point,OrderTakeProfiT(),0);
Print(GetLastError());
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int start()
{
.
.
.
if((orders_buy()==1)&&(Bid-OrderStopLosS()>tral_sl*Point))
{
modify_sl_buy();}
if((orders_sell()==1)&&(OrderStopLosS()-Bid>tral_sl*Point))
{
modify_sl_sell();}
.
.
.
}
вот мои функции которые упрощают трейлинг sl
int shag=10;
int tral_sl=100;
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+int orders_buy()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if((OrderType()==OP_BUY)&&(OrderSymbol()==Symbol()))j++;
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int orders_sell()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if((OrderType()==OP_SELL)&&(OrderSymbol()==Symbol()))j++;
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderStopLosS()
{double j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderStopLoss();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderOpenPricE()
{double j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderOpenPrice();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderTakeProfiT()
{double j=0;for(int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderTakeProfit();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int tiket()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderTicket();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int modify_sl_buy()
{
OrderModify(tiket(),OrderOpenPricE(),OrderStopLosS()+shag*Point,OrderTakeProfiT(),0);
Print(GetLastError());
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int modify_sl_sell()
{
OrderModify(tiket(),OrderOpenPricE(),OrderStopLosS()-shag*Point,OrderTakeProfiT(),0);
Print(GetLastError());
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int start()
{
.
.
.
if((orders_buy()==1)&&(Bid-OrderStopLosS()>tral_sl*Point))
{
modify_sl_buy();}
if((orders_sell()==1)&&(OrderStopLosS()-Bid>tral_sl*Point))
{
modify_sl_sell();}
.
.
.
}
Болбшое Вам спасибо!!! Сейчас попробую разобраться... О результатах напишу
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В учебнике читал, но там смутно написано... Мне неясно как в программе можно выбрать именно тот ордер для его закрытия, который мне нужен?
Пожалуйсто если есть возможность, приведите простые примеры с описанием!