Пробую изучать C#. Нужен совет/наставление! [Решено]
Цитата: Евгений от 16.11.2022, 14:11Всем, доброго времени!
Говорят, что языки программирования, лучше учить зная направление, имея какие-то определённые задачи...
Я раньше не сталкивался с кодом, но всегда хотелось что-то попробовать.
Сейчас есть пару тройку определенных задач, но я совсем не знаю с чего начать... Хотел бы спросить совета, возможно вы меня направите сразу в нужно русло, кстати, начал смотреть уроки Хачатура, дошел до 23, вроде бы, урока, там работа со строками.
Попробую описать первую задачу. В целом, у меня есть на неё решение, на языке Python (писал соответственно не я), но оно не совсем полное. Прикрепляю код [spoiler title=""]import requests import xml.etree.ElementTree as ET import os WorkAmountsUsdt = input('Введите 5 рабочих объемов в USDT через пробел и нажмите Enter\nПример: 100 200 300 400 33\n') WorkAmountsUsdt = list(map(int, WorkAmountsUsdt.split(' '))) if len(WorkAmountsUsdt) != 5: exit('Объемов должно быть 5') exchangeInfo = requests.request("GET", "https://www.binance.com/fapi/v1/exchangeInfo").json() prices = requests.request("GET", "https://www.binance.com/fapi/v1/ticker/price").json() # print(prices) futures_prices = {} for price in prices: futures_prices[price["symbol"]] = price["price"] def work_amount(WorkAmountsUsdt, price, stepSize): price = float(price) stepSize = float(stepSize) WorkAmountsLots = [] for wa in WorkAmountsUsdt: result = wa / price // stepSize * stepSize # print(wa) # print(result) if stepSize < 1: WorkAmountsLots.append(round(float(result), len(symbol["filters"][1]["stepSize"].split('.')[1]))) elif stepSize == 1 or result % 1 == 0: WorkAmountsLots.append(int(result)) # print(WorkAmountsLots) return WorkAmountsLots futures_all_work_amounts_lots = {} print('symbol, price, stepSize, WorkAmountsUsdt') for symbol in exchangeInfo["symbols"]: try: wa = work_amount(WorkAmountsUsdt, futures_prices[symbol["symbol"]], symbol["filters"][2]["stepSize"]) futures_all_work_amounts_lots[symbol["symbol"]] = wa print(symbol["symbol"], futures_prices[symbol["symbol"]], symbol["filters"][2]["stepSize"], wa) except: pass # print(symbol["symbol"], 'не удалось рассчитать') # # тест # for f in futures_all_work_amounts_lots.items(): # print(f) # exit() # Запись в Cscalp def update_work_amounts_in_cscalp_tmp(file, wa): tmp = ET.ElementTree(file=file) for user_levels in tmp.iter('First_WorkAmount'): user_levels.set('Value', f'{wa[0]}') for user_levels in tmp.iter('Second_WorkAmount'): user_levels.set('Value', f'{wa[1]}') for user_levels in tmp.iter('Third_WorkAmount'): user_levels.set('Value', f'{wa[2]}') for user_levels in tmp.iter('Fourth_WorkAmount'): user_levels.set('Value', f'{wa[3]}') for user_levels in tmp.iter('Fifth_WorkAmount'): user_levels.set('Value', f'{wa[4]}') tmp.write(file, "UTF-8") input('\nРабочие объемы рассчитаны\nУбедитесь что Cscalp не запущен и нажмите Enter') exchange_name = 'BINANCE' for file in os.listdir(): # print(file) try: exchange, spot_or_fut, setting_name, n = file.split('.') symbol, settings, key = setting_name.split('_') # print(file, cscalp_levels_format(all_levels[symbol_name])) if spot_or_fut == 'CCUR_FUT' and exchange_name[0:4] in exchange: wa = futures_all_work_amounts_lots[symbol] update_work_amounts_in_cscalp_tmp(file, wa) except: pass print('Запись завершена. Можно запускать Cscalp')
[/spoiler], там его не много, 80 строк... Но я хотел бы написать всё сам на C# Windows Forms, и дополнить под мои нужды ещё некоторыми расчетами, не знаю, возможно ли это для меня?! 😁
Задача кода заключается в следующем:
Надо получить данные с биржи, а именно котировки и их цены, пример: "symbol":"ADAUSDT","price":"0.33570". По этой ссылке можно получить актуальные данные (она же используется в коде на Python) с биржи, они там представлены тупо в одну строку. Далее нужно рассчитать объём в монетах, исходя из желаемого объема в USDT. Что бы понятнее было, обратимся к примеру выше, получится следующее: цена монеты 0.33570, желаемый объем 1000$, значит 1000$ / 0.33570 = 2 978,85 монет и так надо сделать 5 расчётов (например для 1000$ для 500$, 250$, 100$, 3000$) Своего рода мини калькулятор получился. Далее надо получившиеся данные (2 978,85 и ещё 4) записать в файл, точнее отредактировать имеющийся файл, который относится к этой монете (у каждой монеты свой файл, монет около 170). Файл формата ".tmp" следующего вида. [spoiler title=""]<?xml version="1.0" encoding="utf-8"?> <Settings> <DOM> <FilledAt Value="1500000" /> <AutoScroll Value="True" /> <ScrollStepTurbo Value="100" /> <StringHeight Value="10" /> <BigAmount Value="1500000" /> <HugeAmount Value="3000000" /> <PlayBigAmount Value="False" /> <PlayHugeAmount Value="False" /> <RulerDataType Value="2" /> <FindIcebergOrders Value="False" /> <PlayIcebergOrders Value="False" /> <IcebergSuspectedFrom Value="999999" /> <IcebergFactor Value="2" /> <Focus_TSpreadFTick Value="True" /> <FatLevelsFactor Value="50" /> <SlimLevelsFactor Value="10" /> <PanelWidth Value="126" /> <UserLevels Value="" /> <UserSignalPriceLevels Value="" /> <PlayUserSignalPriceLevels Value="True" /> </DOM> <TICK_PANEL> <ShowTicksFrom Value="8500" /> <HideFilteredTicks Value="True" /> <TicksStyle Value="DotsLines" /> <TicksWeight Value="1" /> <SumTicks_Period Value="250" /> <PanelWidth Value="81" /> <BigAmount Value="999999" /> <PlayBigAmount Value="False" /> </TICK_PANEL> <CLUSTER_PANEL> <FilledAt Value="4000000" /> <ShowClusterPanel Value="True" /> <TimeFrame Value="5" /> <GridWidth Value="288" /> <ClusterStyleText Value="Summ" /> <ClusterStyleColor Value="BlackBalance" /> <PanelWidth Value="30" /> </CLUSTER_PANEL> <COMMON_PANEL> <PriceAggregationStep Value="2" /> <PriceAggregationFactor Value="1" /> <MaxAmountZeroDigits Value="0" /> <ReduceAmountThousands Value="True" /> <ShowAdditiveCursor Value="True" /> </COMMON_PANEL> <TRADING> <First_WorkAmount Value="2 978" /> //строки с теми самыми объёмами <Second_WorkAmount Value="1 489" /> <Third_WorkAmount Value="744" /> <Fourth_WorkAmount Value="297" /> <Fifth_WorkAmount Value="8 936" /> <ActiveWorkAmountKey Value="5" /> <IsWorkAmountInMoneyMode Value="True" /> <ThrowLimitTo Value="100" /> <StopLoss_Steps Value="0" /> <TakeProfit_Steps Value="0" /> <StopLimitOrdersThrowRange Value="0" /> <StopOrdersThrowRange Value="0" /> <IsServerStopOrders Value="True" /> <StopOrdersMethod_TPricesFTick Value="False" /> <AveragingMethod Value="Dispatcher" /> <PlaySoundOnTrade Value="True" /> <ShowProfitType Value="2" /> </TRADING> </Settings>
[/spoiler]Вот и вся задача.
Код, который я прикрепил на Python, делает это. Но повторюсь, хочется понять, как это всё реализовать на C# и иметь возможность добавлять свои "хотелки, расчёты".
На данном этапе, у меня получается, в Windows Forms, реализовать только получение монет (так же в одну строку) в файл, ну или вывести их в textBox. Это получилось быстро с помощью уроков Хачатура. А вот дальше стал вопрос, что мне надо учить или с чем разбираться, что бы достичь желаемого.
Текст получился не маленький, всем, заранее, благодарность за прочтение, ну и возможную помощь/подсказки!
Всем, доброго времени!
Говорят, что языки программирования, лучше учить зная направление, имея какие-то определённые задачи...
Я раньше не сталкивался с кодом, но всегда хотелось что-то попробовать.
Сейчас есть пару тройку определенных задач, но я совсем не знаю с чего начать... Хотел бы спросить совета, возможно вы меня направите сразу в нужно русло, кстати, начал смотреть уроки Хачатура, дошел до 23, вроде бы, урока, там работа со строками.
Попробую описать первую задачу. В целом, у меня есть на неё решение, на языке Python (писал соответственно не я), но оно не совсем полное. Прикрепляю код
import requests
import xml.etree.ElementTree as ET
import os
WorkAmountsUsdt = input('Введите 5 рабочих объемов в USDT через пробел и нажмите Enter\nПример: 100 200 300 400 33\n')
WorkAmountsUsdt = list(map(int, WorkAmountsUsdt.split(' ')))
if len(WorkAmountsUsdt) != 5:
exit('Объемов должно быть 5')
exchangeInfo = requests.request("GET", "https://www.binance.com/fapi/v1/exchangeInfo").json()
prices = requests.request("GET", "https://www.binance.com/fapi/v1/ticker/price").json()
# print(prices)
futures_prices = {}
for price in prices:
futures_prices[price["symbol"]] = price["price"]
def work_amount(WorkAmountsUsdt, price, stepSize):
price = float(price)
stepSize = float(stepSize)
WorkAmountsLots = []
for wa in WorkAmountsUsdt:
result = wa / price // stepSize * stepSize
# print(wa)
# print(result)
if stepSize < 1:
WorkAmountsLots.append(round(float(result), len(symbol["filters"][1]["stepSize"].split('.')[1])))
elif stepSize == 1 or result % 1 == 0:
WorkAmountsLots.append(int(result))
# print(WorkAmountsLots)
return WorkAmountsLots
futures_all_work_amounts_lots = {}
print('symbol, price, stepSize, WorkAmountsUsdt')
for symbol in exchangeInfo["symbols"]:
try:
wa = work_amount(WorkAmountsUsdt, futures_prices[symbol["symbol"]], symbol["filters"][2]["stepSize"])
futures_all_work_amounts_lots[symbol["symbol"]] = wa
print(symbol["symbol"], futures_prices[symbol["symbol"]], symbol["filters"][2]["stepSize"], wa)
except:
pass
# print(symbol["symbol"], 'не удалось рассчитать')
# # тест
# for f in futures_all_work_amounts_lots.items():
# print(f)
# exit()
# Запись в Cscalp
def update_work_amounts_in_cscalp_tmp(file, wa):
tmp = ET.ElementTree(file=file)
for user_levels in tmp.iter('First_WorkAmount'):
user_levels.set('Value', f'{wa[0]}')
for user_levels in tmp.iter('Second_WorkAmount'):
user_levels.set('Value', f'{wa[1]}')
for user_levels in tmp.iter('Third_WorkAmount'):
user_levels.set('Value', f'{wa[2]}')
for user_levels in tmp.iter('Fourth_WorkAmount'):
user_levels.set('Value', f'{wa[3]}')
for user_levels in tmp.iter('Fifth_WorkAmount'):
user_levels.set('Value', f'{wa[4]}')
tmp.write(file, "UTF-8")
input('\nРабочие объемы рассчитаны\nУбедитесь что Cscalp не запущен и нажмите Enter')
exchange_name = 'BINANCE'
for file in os.listdir():
# print(file)
try:
exchange, spot_or_fut, setting_name, n = file.split('.')
symbol, settings, key = setting_name.split('_')
# print(file, cscalp_levels_format(all_levels[symbol_name]))
if spot_or_fut == 'CCUR_FUT' and exchange_name[0:4] in exchange:
wa = futures_all_work_amounts_lots[symbol]
update_work_amounts_in_cscalp_tmp(file, wa)
except:
pass
print('Запись завершена. Можно запускать Cscalp')
Задача кода заключается в следующем:
Надо получить данные с биржи, а именно котировки и их цены, пример: "symbol":"ADAUSDT","price":"0.33570". По этой ссылке можно получить актуальные данные (она же используется в коде на Python) с биржи, они там представлены тупо в одну строку. Далее нужно рассчитать объём в монетах, исходя из желаемого объема в USDT. Что бы понятнее было, обратимся к примеру выше, получится следующее: цена монеты 0.33570, желаемый объем 1000$, значит 1000$ / 0.33570 = 2 978,85 монет и так надо сделать 5 расчётов (например для 1000$ для 500$, 250$, 100$, 3000$) Своего рода мини калькулятор получился. Далее надо получившиеся данные (2 978,85 и ещё 4) записать в файл, точнее отредактировать имеющийся файл, который относится к этой монете (у каждой монеты свой файл, монет около 170). Файл формата ".tmp" следующего вида.
<?xml version="1.0" encoding="utf-8"?>
<Settings>
<DOM>
<FilledAt Value="1500000" />
<AutoScroll Value="True" />
<ScrollStepTurbo Value="100" />
<StringHeight Value="10" />
<BigAmount Value="1500000" />
<HugeAmount Value="3000000" />
<PlayBigAmount Value="False" />
<PlayHugeAmount Value="False" />
<RulerDataType Value="2" />
<FindIcebergOrders Value="False" />
<PlayIcebergOrders Value="False" />
<IcebergSuspectedFrom Value="999999" />
<IcebergFactor Value="2" />
<Focus_TSpreadFTick Value="True" />
<FatLevelsFactor Value="50" />
<SlimLevelsFactor Value="10" />
<PanelWidth Value="126" />
<UserLevels Value="" />
<UserSignalPriceLevels Value="" />
<PlayUserSignalPriceLevels Value="True" />
</DOM>
<TICK_PANEL>
<ShowTicksFrom Value="8500" />
<HideFilteredTicks Value="True" />
<TicksStyle Value="DotsLines" />
<TicksWeight Value="1" />
<SumTicks_Period Value="250" />
<PanelWidth Value="81" />
<BigAmount Value="999999" />
<PlayBigAmount Value="False" />
</TICK_PANEL>
<CLUSTER_PANEL>
<FilledAt Value="4000000" />
<ShowClusterPanel Value="True" />
<TimeFrame Value="5" />
<GridWidth Value="288" />
<ClusterStyleText Value="Summ" />
<ClusterStyleColor Value="BlackBalance" />
<PanelWidth Value="30" />
</CLUSTER_PANEL>
<COMMON_PANEL>
<PriceAggregationStep Value="2" />
<PriceAggregationFactor Value="1" />
<MaxAmountZeroDigits Value="0" />
<ReduceAmountThousands Value="True" />
<ShowAdditiveCursor Value="True" />
</COMMON_PANEL>
<TRADING>
<First_WorkAmount Value="2 978" /> //строки с теми самыми объёмами
<Second_WorkAmount Value="1 489" />
<Third_WorkAmount Value="744" />
<Fourth_WorkAmount Value="297" />
<Fifth_WorkAmount Value="8 936" />
<ActiveWorkAmountKey Value="5" />
<IsWorkAmountInMoneyMode Value="True" />
<ThrowLimitTo Value="100" />
<StopLoss_Steps Value="0" />
<TakeProfit_Steps Value="0" />
<StopLimitOrdersThrowRange Value="0" />
<StopOrdersThrowRange Value="0" />
<IsServerStopOrders Value="True" />
<StopOrdersMethod_TPricesFTick Value="False" />
<AveragingMethod Value="Dispatcher" />
<PlaySoundOnTrade Value="True" />
<ShowProfitType Value="2" />
</TRADING>
</Settings>
Код, который я прикрепил на Python, делает это. Но повторюсь, хочется понять, как это всё реализовать на C# и иметь возможность добавлять свои "хотелки, расчёты".
На данном этапе, у меня получается, в Windows Forms, реализовать только получение монет (так же в одну строку) в файл, ну или вывести их в textBox. Это получилось быстро с помощью уроков Хачатура. А вот дальше стал вопрос, что мне надо учить или с чем разбираться, что бы достичь желаемого.
Текст получился не маленький, всем, заранее, благодарность за прочтение, ну и возможную помощь/подсказки!
Цитата: Сергей от 16.11.2022, 14:49Евгений, приветствую 🖐
Всё, что нужно для вашей задачи будет далее в уроках. И как получить по API информацию и как её распарсить, а также как записать в файл. Про всё это и не только далее в уроках.
Евгений, приветствую 🖐
Всё, что нужно для вашей задачи будет далее в уроках. И как получить по API информацию и как её распарсить, а также как записать в файл. Про всё это и не только далее в уроках.
Цитата: Евгений от 16.11.2022, 14:57Цитата: Сергей от 16.11.2022, 14:49Евгений, приветствую 🖐
Всё, что нужно для вашей задачи будет далее в уроках. И как получить по API информацию и как её распарсить, а также как записать в файл. Про всё это и не только далее в уроках.Понял, благодарю! Я просто ещё почему спросил, потому что зная Хачатура, точнее его произведение Win 10 Tweaker, сразу прикинул, что уроки будут, в большей степени, по работе с реестром и прочим, а это, в свою очередь, получается не много не то направление, которое мне надо. Значит ошибаюсь, ну я и говорю, в этом деле я совсем новичок, попробую в свои 32 заставить себя учиться кодить - это достаточно интересно )
Цитата: Сергей от 16.11.2022, 14:49Евгений, приветствую 🖐
Всё, что нужно для вашей задачи будет далее в уроках. И как получить по API информацию и как её распарсить, а также как записать в файл. Про всё это и не только далее в уроках.
Понял, благодарю! Я просто ещё почему спросил, потому что зная Хачатура, точнее его произведение Win 10 Tweaker, сразу прикинул, что уроки будут, в большей степени, по работе с реестром и прочим, а это, в свою очередь, получается не много не то направление, которое мне надо. Значит ошибаюсь, ну я и говорю, в этом деле я совсем новичок, попробую в свои 32 заставить себя учиться кодить - это достаточно интересно )
Цитата: Сергей от 16.11.2022, 15:00Да, с реестром и Windows есть уроки. Поверьте, они Вам тоже пригодятся 😉
Да, с реестром и Windows есть уроки. Поверьте, они Вам тоже пригодятся 😉
Цитата: Евгений от 28.01.2023, 08:41Доброго времени! @potapovs Эту тему можно закрыть, кстати. Спасибо.
Доброго времени! @potapovs Эту тему можно закрыть, кстати. Спасибо.