chciałbym zmodyfikować poniższą funkcję, tak aby stop loss opierał się na wartościach wykresu liniowego (aby nie wskakiwał uruchamiany poprzez górne lub dolne wartości świecy), czyli uwzględniającego tylko wartości zamknięcia. W poniższej funkcji zmieniałem np. zmienna ask i bid na Close[0], niestety poniższa funkcja nadal ustawia stop loss w miejscach, które niewiele mają wspólnego z wprowadzanymi wartościami w zmiennych TS_ActivatedLevel i TS_Distance a tym co pokazuje wykres liniowy.
Bardzo proszę aby ktoś poświęcił chwilę na skorygowanie poniżej funkcji, bo kombinuję przy tym naprawdę już dość długo i nie mogę sobie z tym poradzić

Tak przy okazji, jakby miał ktoś miał w swoich zbiorach funkcję trailing stopa w oparciu o wartość ATR, to byłbym wdzięczny za jej wklejenie.
Kod: Zaznacz cały
//------deklaracja zmiennych------
extern int TrailingStop = 1;
extern int TS_ActivatedLevel=15;
extern int TS_Distance=15;
// wywolanie z funkcji start
if(TrailingStop>0)MoveTrailingStop();
// -----------------------RUCHOMY STOP LOSS-------------------------
void MoveTrailingStop()
{
int ticket = OrderTicket();
double bid = MarketInfo(OrderSymbol(),MODE_BID),
ask = MarketInfo(OrderSymbol(),MODE_ASK),
act_lev = TS_ActivatedLevel*Point, // poziom o d którego ma działać TS
dist = TS_Distance * Point; // -- czyli ile pipsów za ceną ma się przesuwać SL
int cnt,total=OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if( (OrderType() == OP_BUY) && (bid> (OrderOpenPrice() + act_lev)) && (OrderStopLoss() < (bid - dist))) {
if(!OrderModify(ticket, OrderOpenPrice(), bid - dist, OrderTakeProfit(), OrderExpiration(), Yellow)) {
return(0);
}
}
if((OrderType() == OP_SELL) && (ask < (OrderOpenPrice() - act_lev)) && (OrderStopLoss() > (ask + dist))) {
if(!OrderModify(ticket, OrderOpenPrice(), ask + dist, OrderTakeProfit(), OrderExpiration(), Blue)) {
return(0);
}
}
}
}