Всем привет! И спасибо за Спасибо!
Сам учусь, так что если не ответил - ответа пока не знаю ;)
уважаемые форумчане. написал эксперт на основе внешнего индикатора... на валютных парах работает, а на золоте или нефти выдает OrderSend error 131 ... в чем может быть причина ???
131 - неправильный объём (мелкий лот?). Нужно узнать минимальный объём разрешённый по инструменту и шаг:
MarketInfo(Symbol(), MODE_MINLOT)
MarketInfo(Symbol(), MODE_LOTSTEP)
Уважаемый Vorchunozavr спасибо за код,еще такое дело. Как дополнить бота что бы при достижении первого тейк профита ордер переводился в без убыток,а дальше тралился как есть ? Поможете буду очень признателен !!! Прилагаю код.
BU_1, во внешние переменные и в проверку на Digits.
Добавил две функции.
//+------------------------------------------------------------------+
void PartClose()
{ for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderLots() {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if ((Bid - OrderOpenPrice())/Point >= Profit_1 && OrderLots() > Lots - LotsClose)
{
OrderClose(OrderTicket(), LotsClose, Bid, Slippage);
BU_Buy(); //--- Переводим в БУ
}
if ((Bid - OrderOpenPrice())/Point >= Profit_2 && OrderLots() > Lots - LotsClose*2)
OrderClose(OrderTicket(), LotsClose, Bid, Slippage);
}
if (OrderType() == OP_SELL)
{
if ((OrderOpenPrice() - Ask)/Point >= Profit_1 && OrderLots() > Lots - LotsClose)
{
OrderClose(OrderTicket(), LotsClose, Ask, Slippage);
BU_Sell(); //--- Переводим в БУ
}
if ((OrderOpenPrice() - Ask)/Point >= Profit_2 && OrderLots() > Lots - LotsClose*2)
OrderClose(OrderTicket(), LotsClose, Ask, Slippage);
}
}
}
}
}
}
//+------------------------------------------------------------------+
int BU_Buy()
{
for (int i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if ((Bid - OrderOpenPrice())/Point >= Profit_1 && OrderLots() == Lots - LotsClose)
{
Sl = NormalizeDouble(OrderOpenPrice() + BU_1*Point, Digits);
if (OrderStopLoss() != Sl && OrderStopLoss() OrderModify(OrderTicket(), OrderOpenPrice(), Sl, OrderTakeProfit(),0);
}
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
int BU_Sell()
{
for (int i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_SELL)
{
if ((OrderOpenPrice() - Ask)/Point >= Profit_1 && OrderLots() == Lots - LotsClose)
{
Sl = NormalizeDouble(OrderOpenPrice() - BU_1*Point, Digits);
if (OrderStopLoss() != Sl && OrderStopLoss() > Sl)
OrderModify(OrderTicket(), OrderOpenPrice(), Sl, OrderTakeProfit(),0);
}
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
Если кто-то знает, как сделать проще, буду рад увидеть.
Добавлено: 01-10-2013 08:11:33
if(Bid >=price + Step * Point)
Так чтоли?
Да, так.
А почему void GetSignal()?
Нам же нужно значение Signal.
Лучше int GetSignal() & return(Signal).
int GetSignal()
{
Signal = 0;
// - 1 - == Получение показаний индикатора ==============================================
double main1 = iCustom(NULL, 0, "Trend", 0, 1);
double main2 = iCustom(NULL, 0, "Trend", 0, 2);
double sign1 = iCustom(NULL, 0, "Trend", 1, 1);
double sign2 = iCustom(NULL, 0, "Trend", 1, 2);
// - 1 - == Окончание блока =============================================================
// - 2 - == Генерация сигнала покупки ===================================================
if (main1 != EMPTY_VALUE && main2 != EMPTY_VALUE// Линия сменила цвет с красного на..
&& sign1 == EMPTY_VALUE && sign2 != EMPTY_VALUE)// ..голубой
Signal = 1;
// - 2 - == Окончание блока =============================================================
// - 3 - == Генерация сигнала продажи ===================================================
if (sign1 != EMPTY_VALUE && sign2 != EMPTY_VALUE// Линия сменила цвет с голубого на..
&& main1 == EMPTY_VALUE && main2 != EMPTY_VALUE)// .. красный
Signal = -1;
// - 3 - == Окончание блока =============================================================
return(Signal);
}
