1. Подключаете индикатор к сове через iCustom
2. Опрашиваете его с некой периодичностью
3. если значение индикатора станет соответствовать Вашим условиям - открываете ордер
Спасибо большое!!!! вот только как задать эту периодичность???
От xbms, 13 апреля, 2013 в Уголок Программиста
1. Подключаете индикатор к сове через iCustom
2. Опрашиваете его с некой периодичностью
3. если значение индикатора станет соответствовать Вашим условиям - открываете ордер
функция ОнТик() запускается на каждом тике - это довольно часто, если Вы хотите получать значения индикатора с 1 бара, то Вам нужна функция по определению закрытия 0-бара ( здесь не раз выкладывалась ). если Вы планируете использовать значения индикатора с 0-бара, то можно на каждом тике или ожидать прохода ценой некой дистанции.
Спасибо большое!!!! вот только как задать эту периодичность???
Уважаемые кодеры! Не могли бы в следующих обучающих видео рассмотреть интерактивные вопросы: кнопки, окна и т.д.
К примеру, создать кнопку для активации скрипта. Это эффективнее и быстрее, чем в навигаторе активировать.
Сабж. Как проверить свечу, где уже был получен Тейк Профит? Самый быстрый, примитивный и надежный способ кто-нибудь знает? Главное что бы не загромождать код и не нагружать систему.
Выясняете время закрытия ордера ( OrderCloseTime() ), потом номер свечи, содержащей это время ( iBarShift() ) и по номеру проверяете всё что хотите.
Выясняете время закрытия ордера ( OrderCloseTime() ), потом номер свечи, содержащей это время ( iBarShift() ) и по номеру проверяете всё что хотите.
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru/ |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1)
{
datetime t;
int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol()==sy)
{
if (OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if (op {
if (mn {
if (t }
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
Изменено 2 июня, 2016 пользователем Alastar
Уважаемые кодеры! Не могли бы в следующих обучающих видео рассмотреть интерактивные вопросы: кнопки, окна и т.д.
К примеру, создать кнопку для активации скрипта. Это эффективнее и быстрее, чем в навигаторе активировать.
Это немного выходит за рамки МКЛ.К примеру, создать кнопку для активации скрипта.
Уважаемые программисты!
Ситуация: бот открывает ордер бай. Цена идет против нас и через определенное количество пунктов, бот открывает противоположный ордер селл с удвоенным лотом.
Подскажите как рассчитать СЛ и ТП, чтобы закрыться в безубыток + n пунктов?
То есть для удвоенного ордера надо рассчитать ТП, а для первого, который в убытке, надо рассчитать СЛ, чтобы суммарно выйти в безубыток.
Заранее благодарю.
Вопрос к Сергею по урокам программированию MQL.
К третьему уроку по программированию "Как написать советник" Вы не даете готовых кодов советника на индикаторе TMA Fair. И это правильно: новичку наколотить код советника потребуется не один день, зато создается ощущение приобщенности к великому.
Я буква в букву повторил все коды этого советника и наткнулся на глупейшую ошибку, которой в самом начале и быть-то не должно, потому что были скопированы данные самого индикатора TMA Fair (см. прилож.), почему я и обращаюсь за помощью к Сергею помочь убрать эту ошибку. В начале всегда трудно.
Михаил.
dermitau, большое спасибо. Мелочь, а не видна.
Это немного выходит за рамки МКЛ.К примеру, создать кнопку для активации скрипта.
Для активации скрипта нужно отправить активному окну коды горячих клавиш. это делается через АПИ виндовс, т.е. программа на МКЛ вызывает библиотеку виндовс и её использует, согласитесь этот приём не может быть отнесён к МКЛ, ибо там бездна возможностей, всего не опишешь...
разве? ProTrader не на mql создан?
Это немного выходит за рамки МКЛ.К примеру, создать кнопку для активации скрипта.
Подскажите пожалуйста ошибку трейлинга,
в журнале пишет на продажу" ордер модифи 130" - неправильные стопы , проверял, но так и не понял . На покупку все вроде нормально?
//+------------------------------------------------------------------+
void Trailing()
{
for(int i =0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
if(Bid-OrderOpenPrice() >tr_stop*Point)
{
if(OrderStopLoss() {
SL=NormalizeDouble(OrderStopLoss()+tr_step*Point,Digits);
if(OrderStopLoss()!=SL)
{
if(OrderModify(OrderTicket(),Bid,SL,0,0,0)==true)
Print("Ордер на покупку по трейлинг стопу успешно модифицирован");
else
Print("Ордер на покупку не модифицирован, код ошибки",GetLastError());
}
}
}
}
if(OrderType()==OP_SELL)
{
if(OrderOpenPrice()-Ask>tr_stop*Point)
{
if(OrderStopLoss()>Ask+(tr_stop+tr_step+sl)*Point)
SL=NormalizeDouble(OrderStopLoss()-tr_step*Point,Digits);
if(OrderStopLoss()!=SL)
{
if(OrderModify(OrderTicket(),Ask,SL,0,0,0)==true)
Print("ордер на продажу по трейлинг стопу успешно модифицирован");
else
Print("Ордер на продажу не модифицирован, код ошибки",GetLastError());
}
}
}
}
}
}
}блин сколько раз уже говорилось, никогда не сравнивай дабловые переменные!!! это ересь и БОХНАКАЖЕТ!!!!! ~x( ~x( ~x(
я уже даже писал с какго хера это происходит на нулеовм-процессорном уровне, один фиг не помогает...
за это тьмы сила тебя поглотит
if(OrderStopLoss()!=SL)
bool GD(double number1,double number2,int dig)
{
if(NormalizeDouble(MathAbs(number1-number2),dig)>0)
return(true);
else return(false);
}
Изменено 10 июня, 2016 пользователем dermitay
Я обычно так сравниваю ( если, конечно, не мультивалютная сова ) :
вместо if ( OrderStopLoss() != SL )
if ( MathAbs( OrderStopLoss() - SL ) >= _Point )
Подскажите пожалуйста ошибку трейлинга,
в журнале пишет на продажу" ордер модифи 130" - неправильные стопы , проверял, но так и не понял . На покупку все вроде нормально?//+------------------------------------------------------------------+
void Trailing()
{
for(int i =0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
if(Bid-OrderOpenPrice() >tr_stop*Point)
{
if(OrderStopLoss() {
SL=NormalizeDouble(OrderStopLoss()+tr_step*Point,Digits);
if(OrderStopLoss()!=SL)
{
if(OrderModify(OrderTicket(),Bid,SL,0,0,0)==true)
Print("Ордер на покупку по трейлинг стопу успешно модифицирован");
else
Print("Ордер на покупку не модифицирован, код ошибки",GetLastError());
}
}
}
}
if(OrderType()==OP_SELL)
{
if(OrderOpenPrice()-Ask>tr_stop*Point)
{
if(OrderStopLoss()>Ask+(tr_stop+tr_step+sl)*Point)
SL=NormalizeDouble(OrderStopLoss()-tr_step*Point,Digits);
if(OrderStopLoss()!=SL)
{
if(OrderModify(OrderTicket(),Ask,SL,0,0,0)==true)
Print("ордер на продажу по трейлинг стопу успешно модифицирован");
else
Print("Ордер на продажу не модифицирован, код ошибки",GetLastError());
}
}
}
}
}
}
}
Изменено 11 июня, 2016 пользователем vitek01
Не открываются сделки, есть другой советник не мартин с точно такими же условиями на открытие сделки и он работает.
extern double Lots = 0.01;
extern double StopLoss = 0;
extern double TakeProfit = 5;
extern int Slippage = 3;
extern int Magic = 101010;
extern string Martin = "Настройка мартина";
extern int Step = 15;
extern double Multipler = 2.0;
extern string TMATrend = "Настройка TMA";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;
extern int Shift = 5;
double SL, TP, PriceHight, PriceLow, Trend, CenterLine, Price, Lastlot;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
Step *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{ //--------------------------------------------------------
double PriceHight = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,1);
PriceLow = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,2,1);
double Trend = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,Shift);
//--------------------------------------------------------
if (CountTrade() == 0)
{
if (Bid >= PriceHight && Trend >= PriceHight)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "1-й ордер на продажу", Magic, 0, Red);
TP = NormalizeDouble (Bid - TakeProfit * Point, Digits);
}
if (Ask {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "1-й ордер на покупку", Magic, 0, Blue);
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);
}
}
else
{
int order_type = FindLastOrderType();
if (order_type = OP_BUY)
{
Price = FindLastOrderPrice(OP_BUY);
if (Ask {
Lastlot = FindLastLots (OP_BUY);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_BUY, Lastlot, Ask, Slippage, 0, 0, 0, Magic, 0, Blue);
if (ticket Print("Ошибка открытия ордера на покупку");
ModifyOrders(OP_BUY);
}
}
if (order_type = OP_SELL)
{
Price = FindLastOrderPrice(OP_SELL);
if (Bid >= Price + Step*Point)
{
Lastlot = FindLastLots (OP_SELL);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_SELL, Lastlot, Bid, Slippage, 0, 0, 0, Magic, 0, Red);
if (ticket Print("Ошибка открытия ордера на продажу");
ModifyOrders(OP_SELL);
}
}
}
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avg_price, order_lots=0;
Price = 0;
for (int i = OrdersTotal()-1; i >=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
Price += OrderOpenPrice() * OrderLots();
order_lots += OrderLots();
}
}
}
avg_price = NormalizeDouble (Price / order_lots, Digits);
if (otype == OP_BUY) TP = NormalizeDouble(avg_price + TakeProfit * Point, Digits);
if (otype == OP_SELL) TP = NormalizeDouble(avg_price - TakeProfit * Point, Digits);
for (int j = OrdersTotal()-1; j >=0; j--)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0))
Print("Ордера успешно модифицированы");
else Print ("Ошибка при модифицировании ордеров");
}
}
}
}
//+------------------------------------------------------------------+
double FindLastLots (int otype)
{
int oldticket;
double oldlots=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldlots = OrderLots();
}
}
}
return(oldlots);
}
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
int oldticket;
double oldopenprice=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldopenprice = OrderOpenPrice();
}
}
}
return(oldopenprice);
}
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return (OrderType());
}
}
return(-1);
}
//+------------------------------------------------------------------+
int CountTrade()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
count++;
}
}
return (count);
}
//+------------------------------------------------------------------+
Не открываются сделки, есть другой советник не мартин с точно такими же условиями на открытие сделки и он работает.Спойлерextern double Lots = 0.01;
extern double StopLoss = 0;
extern double TakeProfit = 5;
extern int Slippage = 3;
extern int Magic = 101010;
extern string Martin = "Настройка мартина";
extern int Step = 15;
extern double Multipler = 2.0;
extern string TMATrend = "Настройка TMA";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;
extern int Shift = 5;
double SL, TP, PriceHight, PriceLow, Trend, CenterLine, Price, Lastlot;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
Step *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{ //--------------------------------------------------------
double PriceHight = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,1);
PriceLow = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,2,1);
double Trend = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,Shift);
//--------------------------------------------------------
if (CountTrade() == 0)
{
if (Bid >= PriceHight && Trend >= PriceHight)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "1-й ордер на продажу", Magic, 0, Red);
TP = NormalizeDouble (Bid - TakeProfit * Point, Digits);
}
if (Ask {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "1-й ордер на покупку", Magic, 0, Blue);
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);
}
}
else
{
int order_type = FindLastOrderType();
if (order_type = OP_BUY)
{
Price = FindLastOrderPrice(OP_BUY);
if (Ask {
Lastlot = FindLastLots (OP_BUY);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_BUY, Lastlot, Ask, Slippage, 0, 0, 0, Magic, 0, Blue);
if (ticket Print("Ошибка открытия ордера на покупку");
ModifyOrders(OP_BUY);
}
}
if (order_type = OP_SELL)
{
Price = FindLastOrderPrice(OP_SELL);
if (Bid >= Price + Step*Point)
{
Lastlot = FindLastLots (OP_SELL);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_SELL, Lastlot, Bid, Slippage, 0, 0, 0, Magic, 0, Red);
if (ticket Print("Ошибка открытия ордера на продажу");
ModifyOrders(OP_SELL);
}
}
}
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avg_price, order_lots=0;
Price = 0;
for (int i = OrdersTotal()-1; i >=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
Price += OrderOpenPrice() * OrderLots();
order_lots += OrderLots();
}
}
}
avg_price = NormalizeDouble (Price / order_lots, Digits);
if (otype == OP_BUY) TP = NormalizeDouble(avg_price + TakeProfit * Point, Digits);
if (otype == OP_SELL) TP = NormalizeDouble(avg_price - TakeProfit * Point, Digits);
for (int j = OrdersTotal()-1; j >=0; j--)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0))
Print("Ордера успешно модифицированы");
else Print ("Ошибка при модифицировании ордеров");
}
}
}
}
//+------------------------------------------------------------------+
double FindLastLots (int otype)
{
int oldticket;
double oldlots=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldlots = OrderLots();
}
}
}
return(oldlots);
}
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
int oldticket;
double oldopenprice=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldopenprice = OrderOpenPrice();
}
}
}
return(oldopenprice);
}
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return (OrderType());
}
}
return(-1);
}
//+------------------------------------------------------------------+
int CountTrade()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
count++;
}
}
return (count);
}
//+------------------------------------------------------------------+
Ошибку та и не нашел, пришлось переписать код заново, проблема решилась.
Не открываются сделки, есть другой советник не мартин с точно такими же условиями на открытие сделки и он работает.Спойлерextern double Lots = 0.01;
extern double StopLoss = 0;
extern double TakeProfit = 5;
extern int Slippage = 3;
extern int Magic = 101010;
extern string Martin = "Настройка мартина";
extern int Step = 15;
extern double Multipler = 2.0;
extern string TMATrend = "Настройка TMA";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;
extern int Shift = 5;
double SL, TP, PriceHight, PriceLow, Trend, CenterLine, Price, Lastlot;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
Step *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{ //--------------------------------------------------------
double PriceHight = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,1);
PriceLow = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,2,1);
double Trend = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,Shift);
//--------------------------------------------------------
if (CountTrade() == 0)
{
if (Bid >= PriceHight && Trend >= PriceHight)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "1-й ордер на продажу", Magic, 0, Red);
TP = NormalizeDouble (Bid - TakeProfit * Point, Digits);
}
if (Ask {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "1-й ордер на покупку", Magic, 0, Blue);
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);
}
}
else
{
int order_type = FindLastOrderType();
if (order_type = OP_BUY)
{
Price = FindLastOrderPrice(OP_BUY);
if (Ask {
Lastlot = FindLastLots (OP_BUY);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_BUY, Lastlot, Ask, Slippage, 0, 0, 0, Magic, 0, Blue);
if (ticket Print("Ошибка открытия ордера на покупку");
ModifyOrders(OP_BUY);
}
}
if (order_type = OP_SELL)
{
Price = FindLastOrderPrice(OP_SELL);
if (Bid >= Price + Step*Point)
{
Lastlot = FindLastLots (OP_SELL);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_SELL, Lastlot, Bid, Slippage, 0, 0, 0, Magic, 0, Red);
if (ticket Print("Ошибка открытия ордера на продажу");
ModifyOrders(OP_SELL);
}
}
}
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avg_price, order_lots=0;
Price = 0;
for (int i = OrdersTotal()-1; i >=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
Price += OrderOpenPrice() * OrderLots();
order_lots += OrderLots();
}
}
}
avg_price = NormalizeDouble (Price / order_lots, Digits);
if (otype == OP_BUY) TP = NormalizeDouble(avg_price + TakeProfit * Point, Digits);
if (otype == OP_SELL) TP = NormalizeDouble(avg_price - TakeProfit * Point, Digits);
for (int j = OrdersTotal()-1; j >=0; j--)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0))
Print("Ордера успешно модифицированы");
else Print ("Ошибка при модифицировании ордеров");
}
}
}
}
//+------------------------------------------------------------------+
double FindLastLots (int otype)
{
int oldticket;
double oldlots=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldlots = OrderLots();
}
}
}
return(oldlots);
}
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
int oldticket;
double oldopenprice=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldopenprice = OrderOpenPrice();
}
}
}
return(oldopenprice);
}
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return (OrderType());
}
}
return(-1);
}
//+------------------------------------------------------------------+
int CountTrade()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
count++;
}
}
return (count);
}
//+------------------------------------------------------------------+
Там ошибки некоторые исправил, копатся дальше не стал, ордера не открывает все равно, но вычислил что условие на открытие ордеров неверное, отметил в коментариях, посмотрите гдн неправильно! В индикаторах не разбираюсь, незнаю что там изменять надо.
Очередной вопрос к Сергею по урокам программированию MQL: "Программирование советника на мартингейле".
Как всегда, буква в букву два дня смотрел и переписывал урок по мартину.
Ошибок и некритических замечаний не получил.
По итогу: управления от iMa нет (включал/выключал - нет), работают только покупки под "машкой", мультипликатор (сам мартин) не работает - лотность одна и та же.
Изменено 15 июня, 2016 пользователем mischkus
Очередной вопрос к Сергею по урокам программированию MQL: "Программирование советника на мартингейле".
Как всегда, буква в букву два дня смотрел и переписывал урок по мартину.
Ошибок и некритических замечаний не получил.
По итогу: управления от iMa нет (включал/выключал - нет), работают только покупки под "машкой", мультипликатор (сам мартин) не работает - лотность одна и та же.
Добавлено: 15-06-2016 16:40:43
Добавлено: 15-06-2016 16:41:09
Добавлено: 15-06-2016 16:41:41
Да, в журнале ошибок чисто. Аттачу (см. выше)
Столкнулся с такой проблемой, если
if(Close[1]>High[2]) // if(iClose[(1.00001)]>High[(1.00001)])
{
------
}else
if(Close[1][(1.00001)][(1.00001)])
{
-------
}
Как сравнить более точно если так получилось что клозе и не больше и не меньше хайя?
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем